您的位置:首页 > 编程语言 > Java开发

Spring(05)——基于XML配置的自动注入(autowire)

2017-07-07 08:38 232 查看

5 基于XML配置的自动注入(autoWire)

5.1 autowire

通常如果我们需要给一个
bean
注入另一个
bean
时都是通过
set
方法或者构造方法进行注入,其实
Spring
也支持
bean
的自动注入。在定义
bean
时我们可以通过
bean
元素的
autowire
属性来指定是否需要给当前
bean
来自动注入其所关联的
bean
autowire
属性的可选值有四个。no:默认值。表示不进行自动注入。
byName:根据名称进行自动注入。如
beanA
有一个
setBeanB()
方法,指定
autowire=”byname”
Spring
将自动在
bean
容器中寻找名为
“beanB”
bean
通过
setBeanB
方法自动注入给
beanA

byType:根据类型进行自动注入。如
beanA
有一个
setBeanB(BeanB b)
方法,指定
autowire=”byType”
Spring
将自动在
bean
容器中类型为
BeanB
bean
通过
setBeanB()
方法注入给
beanA
。但是如果此时容器中有两个以上类型为
BeanB
bean
时就将抛出异常。
constructor:等同于
byType
,只是当指定
autowire=”constructor”
时表示将通过构造方法根据类型进行自动注入。
根据上面的介绍我们知道,
autowire
属性的可选值有四个,默认为
“no”
。其中
“byname”
“byType”
是针对于通过
set
方法进行注入而言的,而
“constructor”
是针对于通过构造方法注入而言的。如下示例就表示
Spring
在初始化
Hello
时将自动在
bean
容器中寻找类型为
World
bean
通过构造方法进行注入。
public class Hello {

public Hello(World world) {

}

}
<!-- 通过构造方法按照类型进行自动注入 -->
<bean id="hello" class="com.app.Hello" autowire="constructor"/>
如果一个
beanA
需要通过
set
方法注入一个
beanB
,我们在
beanA
上已经通过
autowire=”byType”
指定了将为
beanA
根据关联
bean
的类型通过
set
方法进行自动注入,但同时我们在
beanA
上显示的定义了关联的
beanB
,那么这个时候显示的定义将具有更高的优先级。即对于定义了需要自动注入的
beanA
而言,其中的某个属性如果通过显示的定义进行了注入,
Spring
将不再对该属性进行自动注入。针对这种机制如果我们有一个
beanA
指定了需要根据类型进行自动注入,
beanA
需要注入一个类型为
BeanB
bean
,但此时
bean
容器中有两个类型为
BeanB
bean
,这个时候
Spring
将抛出异常。有了显示定义将不再对该属性进行自动注入的机制后,我们就可以在
beanA
上显示的指定到底将注入哪个
BeanB
类型的
bean
即可。

5.2 default-autowire

如果在我们的应用中
autowire
的行为大都是一样时,我们可以通过
default-autowire
属性来指定默认的
autowire
行为。
default-autowire
的可选值和
autowire
的可选值是一样的,默认也为
“no”
,即不进行自动注入。
default-autowire
属性是定义在
beans
元素上的。如下表示我们的全局
autowire
行为为根据名称进行自动注入。
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd" default-autowire="byName">

</beans>

5.3 autowire-candidate

autowire-candidate
是配合
autowire
使用的,是定义在
bean
上的一个属性,表示是否作为自动注入
bean
的候选者,默认为
true
,即默认所有的
bean
都可以是自动注入机制的候选者。有时候我们可能不希望某一个
bean
经过自动注入机制注入给其它
bean
,这个时候我们就可以指定该
bean
autowire-candidate
属性为
false
。比如有一个
beanA
定义了需要根据类型自动注入一个类型为
BeanB
bean
,但是容器中存在两个类型为
BeanB
bean
,分别为
beanB1
beanB2
,这种情况
Spring
是不能自动注入的。实际上我们想注入给
beanA
的是
beanB1
,这个时候除了像之前所说的显示的将
beanB1
注入给
beanA
外,我们还可以通过在
beanB2
上定义
autowire-candidate=”false”
beanB2
排除在自动注入的候选者行列。
autowire-candidate
只对自动注入起作用,对于手动注入而言,无论
autowire-candidate
是什么值,手动注入都是会起作用的。

5.4 default-autowire-candidates

default-autowire-candidates
的作用就像
default-autowire
的作用类似,也是用来定义全局的
autowire-candidate
行为的,其可选值也有
ture
false
两种,默认为
true
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd" default-autowire="byName"
default-autowire-candidates="true">

</beans>
使用自动注入的好处是可以减少我们对
bean
定义的配置,另一方面是方便我们去替换实现类而不需要改动原
bean
的定义。但使用自动注入后我们的
bean
定义看起来都会是孤零零的一个
bean
元素定义,缺乏显示的注入配置,这对以后的维护以及配置的可读性都有一定的影响。所以在使用的时候还得慎重考虑。(注:本文是基于Spring4.1.0所写)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: