Spring Bean 自动装配

自动装配就是指由 Spring 来自动地注入依赖对象,无需人工参与

Spring3.0 支持“no”、“byName ”、“byType”、“constructor”四种自动装配,默认是“no”指不自动装配
Spring4.0 新支持“autodetect”、“default” 两种自动装配

自动装配的好处是减少构造器注入和 Setter 注入配置,自动装配通过配置 标签的 “autowire” 属性(或 @Autowire 注解)来设置

byName

根据名字进行自动装配,只能用于 setter 注入

<bean id="helloService" class="xxxx.HelloImpl"></bean>
<bean id="bean1" class="xxxx.HelloDecorator" autowire="byName"></bean>

在根据名字注入时,将把当前 Bean 自己排除在外。

byType

指根据类型注入,用于 setter 注入

<bean class="xxxx.HelloImpl"></bean>
<bean id="bean2" class="xxxx.HelloDecorator" autowire="byType"></bean>

在根据类型注入时,将把当前 Bean 自己排除在外。
如果根据类型只找到一个 Bean,没有问题;
如果根据类型找到多个 Bean 时,对于集合类型(如:List、Set)将注入所有匹配的对象,对于其他类型需要设置 “autowire-candidate” 属性为 false 来让指定的 Bean 放弃作为自动装配的候选者,或设置 “primary” 属性为 true 指定某个 Bean 为首选。

<bean class="xxxx.HelloImpl" autowire-candidate="false"></bean>
<bean class="xxxx.HelloImpl" primary="true"></bean>

constructor

和“byType”功能一样,根据类型注入构造器参数,只是用于构造器注入方式

<bean id="bean" class="xxxx.HelloDecorator" autowire="constructor"/>  

自动检测是使用“constructor”还是“byType”自动装配方式,可以在 标签中通过 “default-autowire” 属性指定全局的自动装配方式。

不是所有类型都能自动装配

不能自动装配的数据类型:Object、基本数据类型(Date、CharSequence、Number、URI、URL、Class、int)等
通过 标签 default-autowire-candidates 属性指定的匹配模式,不匹配的将不能作为自动装配的候选者
通过 标签的 autowire-candidate 属性设为 false 的 Bean,不会作为依赖注入的候选者

数组、集合、字典类型的根据类型自动装配

多于数组类型、集合(Set、Collection、List)接口类型:将根据泛型获取匹配的所有候选者并注入到数组或集合中,如:List list; 将选择所有的 HelloApi 类型 Bean 注入到 list 中。

对于集合的具体类型将只选择一个候选者,如 ArrayList list; 将选择一个类型为 HelloApi 的 Bean 注入,而不是选择所有 HelloApi 类型的 Bean 注入。

对于字典(Map)接口类型:根据泛型信息注入,如 Map<String, HelloApi> map; 将选择所有的 HelloApi 类型 Bean 注入到 map 中作为值,键 Bean 的名字。

对于具体字典类型,如 HashMap<String, HelloApi> map; 将只选择一个类型为 HelloApi 的 Bean 注入,而不是选择所有 HelloApi 类型的 Bean 注入。

自动装配好处

首先,自动装配减少了配置量;
其次, “byType” 自动装配能在相应的 Bean 更改了字段类型时自动更新,即修改 Bean 类不需要修改配置;
最重要的缺点就是没有了配置,在查找注入错误时非常麻烦,还有基本类型没法完成自动装配;
最好是指定明确的注入方式,或者采用最新的注解注入方式。


Tags:

Add a Comment

电子邮件地址不会被公开。 必填项已用*标注