1.自动装配的核心概念
- 定义: Bean的自动装配是Spring框架中用于自动满足Bean依赖的一种机制。通过自动装配,Spring容器会在应用上下文中为某个Bean寻找其依赖的Bean,从而减少手动配置的工作量。其核心目标是减少配置代码,通过类型或名称匹配实现依赖注入。
2.Spring Bean的装配机制
- 三种装配机制
- XML显式配置:通过
<bean>
标签手动定义依赖。 - Java显式配置:使用
@Configuration
和@Bean
注解。 - 隐式自动装配:(重点):通过组件扫描(
@ComponentScan
)和自动注入(@Autowired
等)实现
- XML显式配置:通过
2.1 自动装配的四种模式(XML配置)
<bean class="org.example.bean.*" id="...." autowire="byName/byType/constructor">
- byName
- 规则:根据属性名与Bean的
id
匹配。 - 示例:若属性名为
cat
,则寻找id="cat"
的Bean。 - 限制:需保证Bean的
id
与属性名一致,否则注入失败
- 规则:根据属性名与Bean的
- byType
- 规则:根据属性类型匹配Bean的
class
。 - 示例:若属性类型为
Cat
,则容器中必须存在且仅有一个Cat
类型的Bean。 - 冲突处理:多个同类型Bean会抛出异常,需配合
@Qualifier
指定名称
- 规则:根据属性类型匹配Bean的
- constructor
- 规则:类似
byType
,但用于构造函数参数注入。 - 适用场景:依赖必须通过构造器注入时
- 规则:类似
- 默认(no)
- 不启用自动装配,需手动配置依赖。
2.2 Java显式配置
@Configuration
:可以定义一个类为配置类,这个类中的方法可以帮助我们生成一个Bean对象,使用spring容器进行管理。
@Bean
:用于方法前面,方法生成的对象作为容器管理的对象。
java">@Configuration
public class MyConfig {@Beanpublic Set<Integer> types() {Set<Integer> set = new HashSet<>();set.add(1);set.add(2);return set;}
}
2.3 隐式自动装配
-
核心注解
@Autowired
:按类型自动注入,可标注字段、构造器、方法。若存在多个候选Bean,需配合@Qualifier("beanName")
指定名称@Resource
:按名称注入(默认),属于JSR-250规范,支持name
属性指定Bean的id
,已经不再使用@Inject
:与@Autowired
功能类似,属于JSR-330规范,需依赖javax.inject
包
-
配置支持
- 启用注解扫描:在XML中添加
<context:component-scan base-package="..."/>
或通过@ComponentScan
注解 - 在spring.xml中开启注解扫描器
- 启用注解扫描:在XML中添加
<context:component-scan base-package="org.spring.bean"/><!--使用component-scan的时候,base-package包指定后,扫描的内容为org.example.spring.bean.**.*-->
- 示例
java"> @Componentpublic class User {@Autowiredprivate Cat cat;}
3.自动装配的常见问题与解决
- 多个候选Bean冲突
- 方案:使用
@Primary
标记优先Bean,或通过@Qualifier
指定名称
- 方案:使用
- 循环依赖
- 原因:Bean A依赖Bean B,Bean B也依赖Bean A。
- 解决:优先使用构造器注入,或通过
@Lazy
延迟初始化
- 注入失败的可能原因
- 未启用组件扫描(
@ComponentScan
缺失)。 - Bean未注册到容器(如未加
@Component
或相关注解)。 - 类型或名称匹配错误
- 未启用组件扫描(
4.推荐用法
- 推荐使用注解:减少XML配置,提升代码可读性
- 合理使用条件装配:通过
@Conditional
系列注解控制Bean的加载条件,避免冗余配置 - 结合显式配置:复杂依赖或第三方库集成时,可混合使用
@Bean
和自动装配