spring 3种装配方式:
支持混合配置:不管使用JavaConfig还是使用XML进行装配,通常都会创建一个根配置(root configuration),
这个配置会将两个或更多的装配类和/或XML文件组合起来,在根配置中启用组件扫描(通过<context:component-scan>或@ComponentScan)
(1)xml
简单:<bean id="", class="">
<constractor-arg ref/value>
</bean>
(2)javaconfig
进行显式配置时,JavaConfig是更好的方案,因为它更为强大、类型安全并且对重构友好
@Configuration注解表明这个类是一个配置类
@Bean(name="", destrodyMethod) 注解会告诉Spring这个方法将会返回一个对象,该对象要注册为Spring应用上下文中的bean, 默认情况下,bean的ID与带有@Bean注解的方法名是一样的
(3)自动装配 扫描,并进行自动注入
想要将第三方库中的组件装配到你的应用中,在这种情况下,是没有办法在它的类上添加@Component和@Autowired注解的,因此就不能使用自动化装配的方案了
@Component(beanid, 默认就是将类名的第一个字母变为小写) 注解。这个简单的注解表明该类会作为组件类,并告知Spring要为这个类创建bean
Spring支持将@Named作为@Component注解的替代方案
组件扫描默认是不启用的。我们还需要显式配置一下Spring,从而命令它去寻找带有@Component注解的类,并为其创建bean.
@ComponentScan(basePackages={"a", "b"}) 会启用自动扫描,果没有其他配置的话,@ComponentScan默认会扫描与配置类相同的包
@ComponentScan(basePackageClasses={A.class, B.class}) 这样更好,利于重构代码,就是将其指定为包中所包含的类或接口. 在包中创建一个用来进行扫描的空标记接口(marker interface)。
通过标记接口的方式,你依然能够保持对重构友好的接口引用,但是可以避免引用任何实际的应用程序代码
xml 配置:<context:component-scan base-pacage="">
javaconfig配置:
@Configuration
@ComponentScan
自动装配
就是让Spring自动满足bean依赖的一种方法,在满足依赖的过程中,会在Spring应用上下文中寻找匹配某个bean需求的其他bean
@Autowired(required=true) 可以用在类的任何方法上. 如果没有匹配的bean,那么在应用上下文创建的时候,Spring会抛出一个异常。
为了避免异常的出现,你可以将@Autowired的required属性设置为false
将required属性设置为false时,Spring会尝试执行自动装配,但是如果没有匹配的bean的话,Spring将会让这个bean处于未装配的状态。但是,把required属性设置为false时,你需要谨慎对待。如果在你的代码中没有进行null检查的话,这个处于未装配状态的属性有可能会出现NullPointerException。如果有多个bean都能满足依赖关系的话,Spring将会抛出一个异常,表明没有明确指定要选择哪个bean进行自动装配
Spring同时支持@Inject和@Autowired
(4) 混合配置
javaconfig 引用另外一个javaconfig
javaconfig 引用xml
xml引用javaconfig 和xml