spring实战二之Bean的自动装配(非注解方式)
Bean的自动装配
自动装配(autowiring)有助于减少甚至消除配置<property>元素和<constructor-arg>元素,让Spring自动识别如何装配Bean的依赖关系。
1.1 自动装配Bean属性:
Spring提供了四种各具特色的自动装配策略:
1、byName-把与Bean的属性具有相同名字的其他Bean自动装配到Bean的对应属性中。如果没有跟属性的名字相匹配的Bean,则该属性不进行装配。
2、byType-把与Bean的属性具有相同类型的其他Bean自动装配到Bean的对应属性中。如果没有跟属性的类型相匹配的Bean,则该属性不被装配。
3、constructor-把与Bean的构造器入参具有相同类型的其他Bean自动装配到Bean构造器的对应入参中。
4、autodetect-首先尝试使用constructor进行自动装配。如果失败,再尝试使用byType进行自动装配。
1.1.1 byName自动装配:
不使用byName自动装配之前是这样声明的:
<bean id="kenny2" class="com.springinaction.springidol.Instrumentalist">
<property name="song" value="Jingle Bells"></property>
<property name="instrument" ref="instrument"></property> </bean>
使用byName自动装配之后是这样的:
<bean id="instrument" class="com.springinaction.springidol.Saxophone"/>
<bean id="kenny2" class="com.springinaction.springidol.Instrumentalist" autowire="byName">
<property name="song" value="Jingle Bells"></property>
</bean>
byName自动装配遵循一项约定,为属性自动装配ID与该属性的名字相同的Bean。通过设置autowire属性为byName,spring将为该bean的属性寻找与其名字相同的Spring Bean。使用byName的缺点是需要Bean的名字与其他bean的属性的名字一样。
1.1.2 byType自动装配:
byType自动装配的工作方式类似于byName自动装配,只不过不再是匹配属性的名字而是检查属性的类型。当我们尝试使用byType自动装配时,Spring会寻找哪一个Bean的类型与属性的类型相匹配。
但是byType自动装配存在一个局限性:如果Spring寻找到多个Bean,它们的类型与需要自动装配的属性的类型都相匹配,怎么办呢?在这种场景下,Spring不会猜测哪一个Bean更适合自动装配,而是选择抛出异常。所以,应用只允许存在一个Bean与需要自动装配的属性类型相匹配。
为了避免因为使用byType自动装配而带来的歧义,Spring为我们提供了另外两种选择:可以为自动装配标识一个首选的Bean,或者可以取消某个Bean自动装配的候选资格。
为自动装配标识一个首选Bean,可以使用<bean>元素的primary属性。如果只有一个自动装配的候选Bean的primary属性设为true,那么该Bean将比其他候选Bean优先被选择。
但是primary属性有个很怪异的一点:它默认设置为true。所以,为了使用primary属性,我们不得不将所有非首选的primary属性设为false。例如:
<bean id="instrument" class="com.springinaction.springidol.Saxophone" primary="false"/>
primary属性仅对标识首选Bean有意义。如果在自动装配时,我们希望排除某些Bean,那可以设置这些Bean的autowire-candidate属性为false,如下所示:
<bean id="instrument" class="com.springinaction.springidol.Saxophone" autowire-candidate="false"/>
1.1.3 constructor自动装配:
<bean id="duke"
class="com.springinaction.springidol.PoeticJuggler"
autowire="constructor" />
constructor自动装配具有和byType自动装配相同的局限性。当发现多个Bean匹配某个构造器的入参时,Spring不会尝试猜测哪一个Bean更适合自动装配。此外,如果一个类有多个构造器,它们都满足自动装配的条件时,Spring也不会尝试猜测哪一个构造器更适合使用。
1.1.4 最佳自动装配
如果想要自动装配bean,但是又不能决定该使用哪一种类型的自动装配,那么可以设置autowire属性为autodetect,由spring 来决定。
<bean id="duke"
class="com.springinaction.springidol.PoeticJuggler"
autowire="autodetect" />
当配置一个Bean的autowire属性为autodetect时,Spring将首先使用constructor自动装配,如果没有发现与构造器相匹配的Bean时,Spring将尝试使用byType自动装配。
1.2 默认自动装配
如果需要为Spring应用上下文中的每一个bean(或者其中的大多数)配置相同的autowire属性,那么就可以要求Spring为它所创建的所有bean应用相同的自动装配策略来简化配置,所需要的做的仅仅是在根元素<beans>上添加一个default-autowire属性:
<?xml version="1.0" encoding="UTF-8"?>
<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-3.0.xsd"
default-autowire="byType">
</beans>
默认情况下,default-autowire属性被设置为none,标示所有Bean都不使用自动装配,除非bean自己配置了autowire属性。在某个配置文件中的default-autowire只是应用于指定Spring配置文件中的所有Bean,并没有应用于Spring应用上下文中的所有bean。可以在一个Spring应用上下文中定义多个配置文件,每一个配置文件都可以有自己的默认自动装配策略。同样的,不能因为配置了一个默认的自动装配策略,就意味着所有的bean都只能使用这个默认的自动装配策略,还可以使用<bean>元素的autowire属性来覆盖<bean>元素所配置的默认自动装配策略。
1.3 混合使用自动装配和显示装配
如果对某个bean选择了自动装配,并不代表不能对该bean的某些属性进行显示装配。我们仍然可以为任意一个属性配置<property>元素,就像我们之前没有配置autowire一样。
<bean id="kenny"
class="com.springinaction.springidol.Instrumentalist"
autowire="byType">
<property name="song" value="Jingle Bells" />
<property name="instrument" ref="saxophone" />
</bean>
混合使用自动装配和手工装配非常成功的解决了使用byType自动装配策略所可能产生的装配不确定性问题。如果在Spring上下文中有多个bean实现了Instrument接口,为了规避Spring无法从这几个实现了Instrument接口的Bean中进行明确挑选而抛出异常,可以显示的装配instrument属性来覆盖自动装配。
使用混合装配的最后一个注意事项:当使用constructor自动装配策略时,必须让Spring自动装配构造器的所有入参,而不能混合使用constructor自动装配策略和<constructor-arg>元素。
spring实战二之Bean的自动装配(非注解方式)的更多相关文章
- spring实战四之Bean的自动装配(注解方式)
使用注解装配: 从spring2.5开始,Spring启用了使用注解自动装配Bean的属性,使用注解方式自动装配与在XML中使用 autowire 属性自动装配并没有太大区别,但是使用注解方式允许更细 ...
- Spring学习03(Bean的自动装配)
6.Bean的自动装配 6.1 自动装配说明 自动装配是使用spring满足bean依赖的一种方法 spring会在应用上下文中为某个bean寻找其依赖的bean. Spring中bean的三种装配机 ...
- spring实战五之Bean的自动检测
在spring实战四中,使用在Spring中增加<context:annotation-config>的方式告诉Spring,我们打算使用基于注解的自动装配,希望Spring特殊对待我们所 ...
- Spring学习--xml 中 Bean 的自动装配
Spring IOC 容器可以自动装配 Bean. 只要在 <bean> 的 autowire 属性里指定自动装配的模式. byName(根据名称自动装配):必须将目标 Bean 的名称和 ...
- Spring基础——在 Spring Config 文件中基于 XML 的 Bean 的自动装配
一.Spring IOC 容器支持自动装配 Bean,所谓自动装配是指,不需要通过 <property> 或 <constructor-arg> 为 Bean 的属性注入值的过 ...
- Spring(三):bean的自动装配
Bean的自动装配 自动装配是Spring满足bean依赖的一种方式. Spring会在上下文中自动寻找,并自动给bean装配属性 Spring中三种装配方式 在xml中显式的配置. 在java中显式 ...
- bean的自动装配,使用注解开发,使用java的方式配置Spring
bean的自动装配 自动装配是Spring满足bean依赖一种方式! Spring会在上下文中自动寻找,并自动给bean装配属性! 在Spring中有三种装配的方式 在xml中显示的配置 在java中 ...
- Spring bean的自动装配属性
bean的自动装配属性能简化xml文件配置. bean 的自动装配属性分为四种: 1.byName 2.byTyoe 3.constructor 4. autodetect byName: 它查找配置 ...
- spring框架学习(四)自动装配
set注入和构造注入有时在做配置时比较麻烦.所以框架为了提高开发效率,提供自动装配功能,简化配置.spring框架式默认不支持自动装配的,要想使用自动装配需要修改spring配置文件中<bean ...
随机推荐
- To the Max
To the Max --------------------------------------------------------------------------------Time Limi ...
- [BZOJ1659][Usaco2006 Mar]Lights Out 关灯
[BZOJ1659][Usaco2006 Mar]Lights Out 关灯 试题描述 奶牛们喜欢在黑暗中睡觉.每天晚上,他们的牲口棚有L(3<=L<=50)盏灯,他们想让亮着的灯尽可能的 ...
- nginx: [emerg] getpwnam(“www”) failed
在配置nginx 时提示如下错误时:nginx: [emerg] getpwnam(“www”) failed 解决方案一 在nginx.conf中 把user nobody的注释去掉既可 解决方案二 ...
- 【js】将table的每个td的内容自动赋值给其title属性
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- Android 中的selector
今天做程序时,发现了selector 选择器不单单能用系统的自定义属性(比如, <item android:state_selected="true" android:co ...
- (转)SQL Server 的事务和锁(一)
SQL Server 的事务和锁(一) 最近在项目中进行压力测试遇到了数据库的死锁问题,简言之,如下的代码在 SERIALIZABLE 隔离级别造成了死锁: 1 2 3 4 5 6 7 8 9 1 ...
- Linux服务器通过rz/sz轻松上传下载文件
Linux服务器通过命令行远程访问时,上传文件还需要ftp所以不太方便,可以使用rz这个小工具来上传不太大的文件,方法如下: 输入rz,如果提示命令不存在,证明还没有安装,以CentOS为例,安装命令 ...
- DP:Corn Fields(POJ 3254)
北大教你如何高效养牛(误)(点我查看) 2015-08-21: 问题的大意就是有一片稻田,里面有很多坑,你要在上面种稻谷,然后呢田里面还会养牛,牛不喜欢扎堆吃饭,所以呢你种的稻谷要间隔种在坑里面,所 ...
- MySQL 查询最大最小值优化
1. 假设你使用了Innodb存储引擎2. 假设你在innodb设定了主键(聚集索引) 3. 因为聚集索引页面之间是通过双向链表链接,页按照主键的顺序排序 每个页中的记录也是通过双向链表维护.聚集索引 ...
- COURSES(poj 1469)
题意: 给你p门课程和n个学生,一个学生可以选0门,1门,或者多门课程,现在要求一个由p个学生组成的集合,满足下列2个条件: 1.每个学生选择一个不同的课程 2.每个课程都有不同的代表 如果满足,就输 ...