欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Spring3之Bean的自动装配

程序员文章站 2022-05-23 10:33:29
...

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

目前Spring3.0支持“no”、“byName ”、“byType”、“constructor”四种自动装配,默认是“no”指不支持自动装配的,其中Spring3.0已不推荐使用之前版本的“autodetect”自动装配,推荐使用@Autowired注解方式代替;如果想支持“autodetect”自动装配,请将schema改为“spring-beans-2.5.xsd”。

自动装配的好处是减少构造器注入和setter注入配置(其实就是少了<property>标签,但是Bean里面set方法还是必须的),减少配置文件的长度。自动装配通过配置<bean>标签的“autowire”属性来改变自动装配方式。接下来让我们挨着看下配置的含义。
default:表示使用默认的自动装配,默认的自动装配需要在<beans>标签中使用default-autowire属性指定,其支持“no”、“byName ”、“byType”、“constructor”四种自动装配

no:意思是不支持自动装配,必须用户<property name="beanA" ref="bean_a"/>明确指定依赖。

byName:通过设置Bean标签的属性autowire="byName",意思是根据名字进行自动装配,只能用于setter注入。比如我们有方法setBeanA(MyBeanA myBeanA),Spring容器将查找配置文件里标志为beanA的Bean并注入,如果找不到,将什么也不注入。

<bean id="beanA" class="com.chou.bean.MyBeanA"/>
<bean id="bean_b" class="com.chou.bean.MyBeanB" autowire="byName"/>

配置里没有了<property>了,如果一个bean有很多setter注入,通过“byName”方式能减少很多<property>配置。需要注意的是,在根据名字注入时,将把当前Bean自己排除在外:比如“hello”Bean类定义了“setHello”方法,则hello是不能注入到“setHello”的。

byType:通过设置Bean定义属性autowire="byType",意思是指根据类型注入,用于setter注入,比如如果指定自动装配方式为“byType”,而setBeanA(MyBeanA myBeanA)方法需要注入MyBeanA类型数据,则Spring容器将查找MyBeanA类型的Bean,(将把当前Bean自己排除在外)如果找到一个则注入该Bean,如果找不到将什么也不注入。

<bean id="beana" class="com.chou.bean.MyBeanA" autowire-candidate="false"/>
<bean id="beanA" class="com.chou.bean.MyBeanA" primary="true"/>
<bean id="bean_b" class="com.chou.bean.MyBeanB" autowire="byType"/>

根据类型找到多个Bean时,对于集合类型(如List、Set)将注入所有匹配的候选者,而对于其他类型遇到这种情况可能需要使用“autowire-candidate”属性为false来把指定Bean从自动装配候选者中移除,或使用“primary”属性为true来指定某个Bean为首选Bean

constructor:通过设置Bean定义属性autowire="constructor",功能和“byType”功能一样,根据类型注入构造器参数,只是用于构造器注入方式。

autodetect:自动检测是使用“constructor”还是“byType”自动装配方式,已不推荐使用。如果Bean有空构造器那么将采用“byType”自动装配方式,否则使用“constructor”自动装配方式。此处要把3.0的xsd替换为2.5的xsd,否则会报错。

不是所有类型都能自动装配
不能自动装配的数据类型:Object、基本数据类型(Date、CharSequence、Number、URI、URL、Class、int)等;

通过“<beans>”标签default-autowire-candidates属性指定的匹配模式,不匹配的Bean将不能作为自动装配的候选者,例如指定“*Service,*Dao”,将只把匹配这些模式的Bean作为候选者,而不匹配的不会作为候选者;

通过将“<bean>”标签的autowire-candidate属性可被设为false,从而该Bean将不会作为依赖注入的候选者。

数组类型、集合(Set、Collection、List)接口类型:将根据泛型获取匹配的所有候选者并注入到数组或集合中,如“List<HelloApi> list”将选择所有的HelloApi类型Bean并注入到list中,而对于集合的具体类型将只选择一个候选者,如“ArrayList<HelloApi> list”将选择一个类型为HelloApi的Bean注入,而不是选择所有的HelloApi类型Bean进行注入;

字典(Map)接口类型:同样根据泛型信息注入,键必须为String类型的Bean名字,值根据泛型信息获取,如“Map<String, HelloApi> map” 将选择所有的HelloApi类型Bean并注入到map中,而对于具体字典类型如“HashMap<String, HelloApi> map”将只选择类型为HashMap的Bean注入,而不是选择所有的HelloApi类型Bean进行注入

自动装配注入方式能和配置注入方式一同工作吗?当然可以,大家只需记住配置注入的数据会覆盖自动装配注入的数据。


依赖检查(Spring3已经不推荐)
在Spring的Web应用中很可能发生没有匹配的Bean进行自动装配,如果此种情况发生,只有在程序运行过程中发生了空指针异常才能发现错误,如果能提前发现该多好啊,这就是依赖检查的作用。

依赖检查:用于检查Bean定义的属性都注入数据了,不管是自动装配的还是配置方式注入的都能检查,如果没有注入数据将报错,从而提前发现注入错误,只检查具有setter方法的属性。
Spring3+也不推荐配置方式依赖检查了,建议采用@Required注解方式,测试时请将XML schema降低为2.5版本的,和自动装配中“autodetect”配置方式的xsd一样。
依赖检查有四种方式:
none:默认方式,表示不检查;
objects:检查除基本类型外的依赖对象,如果有简单数据类型的属性为null,也不报错;
simple:对基本类型进行依赖检查,包括数组类型,其他依赖不报错
all:对所以类型进行依赖检查,配置方式为:dependency-check="all"

<bean id="bean_b" class="com.chou.bean.MyBeanB"/>
<bean id="bean_a" class="com.chou.bean.MyBeanA" dependency-check="all">
   <property name="bean_b" ref="helloApi"/>  
   <property name="message" value=""/>  
</bean>

转载于:https://my.oschina.net/easyean/blog/535101