1、配置可选方案
(1)在XML中进行显式配置
(2)在java中进行显式配置
(3)隐式的bean发现机制和自动装配
尽可能使用自动配置的机制,显式配置越少越好
==> 必须显式配置,使用JavaConfig
==> 最后使用有便利命名空间的XML
2、自动化装配bean
两个角度实现:
组件扫描:Spring会自动发现应用上下文所创建的bean
自动装配:Spring自动满足bean之间的依赖
2.1 创建可被发现的bean
(1)@component注解
——表明该类会作为组件类,并告知Spring要为该类创建bean。
(2)启用组件扫描
——组件扫描默认不启用,需要显式配置Spring
(i)通过java代码启用组件扫描
使用@ComponentScan注解——能够在Spring中启用组件扫描
若没有其他配置,默认扫描与配置类相同的包,查找带有@component注解的类,在Spring中自动创建一个bean
(ii)使用XML启用组件扫描
可使用Spring context命名空间的<context:component-san>
元素
2.2 为组件扫描的bean命名
Spring应用上下文中所有的bean都会给定一个ID,默认根据类名指定一个ID,就是将类名的首字母变成小写。
如果想设置不同的ID,将期望的ID作为值传入@component注解——@component(“xxx”)
2.3 设置组件扫描的基础包
(1)basePackages属性
@ComponentScan(“指定的包名”)
@ComponentScan(basePackages = {
"xxx", "xxx"} )
——类型不安全,重构代码后,所指定的基础包可能出现错误
(2)basePackageClasses属性
——指定为包中所包含的类或接口,将这些类所在的包作为组件扫描的基础包
@ComponentScan(basePackageClasses = {
xxx.class, xxx.class } )
可以在要扫描的包中,创建一个用来进行扫描的空标记接口,能够保持对重构友好的接口引用,避免引用任何实际的应用程序代码。
2.4 通过为bean添加注解实现自动装配
@Autowired注解
- 在需要装配的地方添加该注解
- 可用在构造器、Setter方法以及任何其他的方法上
若有且只有一个bean匹配依赖需求,就会被装配起来
如果没有匹配的bean,在应用上下文创建时,Spring会抛出异常。
为了避免异常的出现,可以设置:
@Autowired(required = false)。
required=false后,如果没有匹配的bean,会让这个bean处于未装配的状态,需要进行NULL检查,可能出现NPE!
如果有多个bean能够满足依赖关系,抛出异常,表明没有明确指定要选择哪个bean进行装配。
@Autowired是Spring特有的,还可以替换为@Inject注解,其来源于java依赖注入规范,该规范还定义了@Named注解,可替换@Component注解。