第二章:装配Bean
Spring容器负责把需要相互协作的对象引用赋予各个对象。创建应用对象之间协作关系的行为通常称为装配(wiring)。
2.1、Spring配置的可选方案
·XML显式配置
·java类中进行显式配置
·隐式的bean发现机制和自动装配
2.2自动化装配bean
Spring从两个角度来实现自动化装配:
·组件扫描(component scanning) 自动发现应用上下文中所创建的bean
·自动装配(autowiring) Spring自动满足bean之间的依赖
组件扫描
1、开启自动扫描注解
组件扫描默认是不开启的,所以需要手动开启。使用@Configuration注解表示类为配置类,@ComponentScan表示扫描此类以及此类所在的包下。
2、编写bean
此类必须与上面的config在同个包下(因为声明了@ComponentScan,否则需要声明扫描的包),使用@Service(@ComponentScan或者@Controller也一样)声明该类会作为组件类,告知spring扫描的时候要创建此bean。
3、测试
在Junit中进行测试,注意,必须用@ContextConfiguration告知spring要配置启动config配置类,此时就可以实现注入Service bean。
·上面的方法是基于java类的配置,也可以用XML来启用组件扫描,仅需要如下:
默认Spring为bean设置的ID是把类名的第一个字母改为小写,也可以手动给bean赋ID,使用@Component(“myBeanName”)
如果config类和bean所在的包不同,想要让config类去扫描指定的包,使用basePackages 或basePackageClasses 即可声明扫描包或者某个类,如下:
自动装配
自动装配就是让Spring自动满足bean依赖的一种方法,在应用上下文寻找某个bean需求的其他bean。使用@Autowired注解。
@Autowired可以注解在构造器,Setter方法或其他的方法,也可以直接注解在属性对象上。
此时如果找不到相关类型的bean时,则会抛出异常,我们可以使用注解声明表示不是必须的,此时找不到就不会抛出异常。
如果找到了多个bean都能满足依赖关系的话,则Spring会抛出异常,表示没有明确选择哪个bean进行自动装配。
·@Autowired和@Inject和@Resource的区别
@Autowired是Spring自带的注解(使用Class做匹配区分装配哪个bean,如果要用bean的ID做匹配,需要加**@Qualifier**(“XXX”)注解)
@Inject注解进行自动装配(与autowired基本一样,区别是Autowired带一个required选项,但是要以ID匹配时加的是@Name)
@Resource注解注入则不同,此注解默认是使用bean的ID做匹配。
2.3通过java代码手动装配bean
第三方的jar包中的类就无法在其中写注解,所以Spring还提供了手动装配bean的方式。此时可以选择java代码装配或者XML配置装配。
java代码装配
实例如下,添加@Configuration,告知Spring这是一个配置类,在其中使用@Bean标签,告诉Spring为此方法创建一个Bean。 Bean的ID和方法名一样,也可以使用@Bean(name = “xxx”)指定生成的Bean的ID。
实现注入的方式在下图也提现了,最简单的方式就是引用创建bean的方法。(因为car()方法上添加了@Bean注解,Spring会拦截所有对他的调用,确保直接返回该方法所创建的bean,不是每次都对方法进行实际调用new)
也可以直接在参数中传入一个参数,这样子Spring会自动找寻该类型的Bean然后传入给此方法。这样子的好处是 Car类的声明可以放到其他配置类中(或者XML),推荐使用。 同理@Bean也可以声明在setter方法等其他地方。
2.4通过XML装配Bean
如下,类似于@Configuration,而类似于@Bean
如果不指定id=,则默认id的值为包名加类名加计数(com.gjsyoung.test.domain.Car#0,#0表示第几个,如果是#1表示第二次创建此bean),用给属性设置值,value设置普通属性,ref设置引用属性。也可以使用调用构造器设置值。也可以使用或标签装配List/Set
2.5导入和混合配置
可以同时使用自动化和显式子配置。
在java配置类导入另外的配置:
现在car这个bean被声明在另外一个java配置类中,使用@Import导入另外一个配置类。
使用@ImportResource(xml)加载另外一个XML
同理,在car.xml中配置car这个bean,需要使用@ImportResource导入一个xml配置文件。
在XML配置中导入
·XML中import另一个xml,相当于上面的@ImportResource,没有XML元素能够导入JavaConfig类,但是可以用bean标签导入一个配置类
可以使用一个更高级的配置类(根配置)来专门加载这些配置。专门做导入的一个配置类,在该类中使用@componentScan和context:component-scan