須要在類上使用@Component註解:java
@Component public class Car ...
而後在Java配置類中開啓組件掃描:函數
@Configuration @ComponentScan public class AppConfig ...
若是使用XML來自用組件掃描的話:ui
<context:component-scan base-package="你的包" />
自動裝配被@Component修飾的Bean:this
@ContextConfiguration(classes=AppConfig.class) public class CarTest { @Autowired private Car car; ... }
Spring應用上下文中全部的Bean都會有一個ID。若是沒有明確設置Bean的ID,那麼ID就是將類名的第一個字母變爲小寫,例如Car對象的ID就是car。spa
若是須要自定義Bean的ID:code
@Component("miniCar") public class Car ...
還可使用Java依賴注入規範中所提供的@Named註解來設置:component
@Named("miniCar") public class Car ...
若是使用@ComponentScan來打開自動掃描Bean,若是不設置指定掃描的包名的話,它會按照默認規則,以配置類所在的包做爲基礎包來掃描。xml
但也能夠手動設置:對象
@Configuration @ComponentScan("你的包名") public class AppConfig ...
還能夠設置多個包:接口
@Configuration @ComponentScan(basePackages={"包1", "包2"}) public class AppConfig ...
另外,能夠指定包中所包含的類或接口:
@Configuration @ComponentScan(basePackageClasses={Car.class, Xxx.Class}) public class AppConfig ...
爲了聲明要進行自動裝配,可使用@Autowired註解。
@Component public class Driver { private Car car; @Autowired public Driver(Car car) { this.car = car; } }
上面是經過構造函數注入,還能夠經過setter方法注入:
@Autowired public void setCar(Car car) { this.car = car; }
實際上,setCar()方法沒有任何特殊之處,@Autowired註解能夠用在類的任何方法上,例如:
@Autowired public void insertCar(Car car) { this.car = car; }
若是沒有匹配到Bean,那麼在應用上下文建立的時候,Spring會拋出一個異常,爲了不異常的出現,能夠將@Autowired的required屬性設置爲false:
@Autowired(required=false) public void setCar(Car car) { this.car = car; }
在設置required等於false時,若是在代碼中沒有進行null檢查,而使用這個未匹配到的Bean對象的話,可能會出現NullPointerException異常。
Java依賴注入規範也提供了@Inject替代@Autowired:
@Named public class Driver { private Car car; @Inject public Driver(Car car) { this.car = car; } }
儘管在不少場景下經過組件掃描和自動裝配實現Spring的自動化配置是更爲推薦的方式,可是有時候自動裝配的方案行不通,所以須要明確配置Spring。好比說,要將第三方庫中的組件裝配到你的應用中,是沒有辦法在它的類上添加@Component和@Autowired註解的,所以就不能使用自動化裝配方案了。
在配置類中,編寫一個方法建立所需類型的實例,而後給這個方法添加@Bean註解:
@Configuration public class AppConfig { @Bean public Car car() { return new Car(); } }
也能夠給這個Bean重命名:
@Configuration public class AppConfig { @Bean(name="miniCar") public Car car() { return new Car(); } }
在配置中最簡單的方式就是引用建立的bean方法,例如:
@Configuration public class AppConfig { @Bean public Car car() { return new Car(); } @Bean public Driver driver() { return new Driver(car()); } }
上面的代碼中,給每一個司機一輛新的車,若是想讓全部司機使用同一輛車的話,能夠這麼作:
@Configuration public class AppConfig { @Bean public Car car() { return new Car(); } @Bean public Driver driver(Car car) { return new Driver(car); } }
driver()方法請求一個car做爲參數。當Spring調用driver()方法建立driver的時候,它會自動裝配一個car到配置方法中。
使用XML聲明Bean:
<bean id="car" class="package.Car" />
經過構造器注入初始化Bean有兩個方案:
<bean id="driver" class="package.Driver"> <constructor-arg ref="car" /> </bean>
<bean id="driver" class="package.Driver" c:car-ref="car" />
裝配集合:
<constructor-age> <list> <value>item1</value> <value>item2</value> <value>item3</value> </list> </constructor-age>
<constructor-age> <list> <ref bean="car1" /> <ref bean="car2" /> <ref bean="car3" /> </list> </constructor-age>
<constructor-age> <set> <value>item1</value> <value>item2</value> <value>item3</value> </set> </constructor-age>
設置屬性:
<bean id="driver" class="backage.Driver"> <property name="car" ref="Car" /> </bean>
<bean id="driver" class="backage.Driver" p:car-ref="car" />
假設咱們如今有DriverConfig和CarConfig兩個Java代碼配置類,和一個XML配置文件,咱們須要一種方法將這兩個Java配置類和一個XML配置文件組合在一塊兒,可使用@Import和@ImportResource這兩個註解:
@Configuration @Import(CarConfig.class) @Import("classpath:xml-config.xml") public class DriverConfig ...
可使用<import>元素來拆分XML配置,並經過bean導入JavaConfig配置類:
<import resoune="car-config.xml" />
<bean class="package.CarConfig" />