Spring3之Bean的自动装配


自动装配就是指由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>

你可能感兴趣的:(spring,bean,自动装配,依赖检查)