须要在类上使用@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" />