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所写)
相关文章推荐
- 【Spring学习05】四种xml配置注入方式
- Spring——基于XML配置的依赖注入
- SpringXML方式配置bean的自动装配autowire
- 简单明了介绍Spring手工注入@autowire用法 及 beans.xml配置区别
- Spring 3.0 学习-DI 依赖注入_创建Spring 配置-使用一个或多个XML 文件作为配置文件,使用自动注入(byName),在代码中使用注解代替自动注入,使用自动扫描代替xml中bea
- Spring--IoC--基于XML的DI-自动注入-byName
- Spring--IoC--基于XML的DI-自动注入-byType
- Spring基于xml配置文件对list、set、map集合的属性注入
- 框架 day36 Spring3 入门,DI依赖注入,装配bean基于xml/注解, 整合Junit4,配置约束自动提示
- 实习总结(十)---Spring的下载/安装/优点/依赖注入方式/自动配置
- Spring如何实现自动依赖注入-------autowire
- Spring依赖注入的简单示例(基于注解配置)
- Spring基础之二:xml配置注入
- spring学习笔记12----Spring+jdbc组合开发( 采用基于xml方式配置事务)
- spring采用基于xml配置方式进行事务的处理
- Spring3.2 中 Bean 定义之基于 XML 配置方式的源码解析
- SqlMapConfig.xml---在spring配置文件中自动加载的mybatis文件
- Spring3与Hibernate4整合,Spring中配置Hibernate基于XML和annotation的sessionFactory方式。
- spring aop的使用(注解方式以及基于xml配置方式)
- 基于spring自动注入及AOP的表单二次提交验证