Spring学习----------Spring自动装配Bean的属性

本文介绍了Spring框架中四种自动装配策略:byName、byType、constructor和autodetect,并详细解析了各自的优缺点及应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先我们来看一下以前我们是如何手动装配一个bean的:
先看一段java程序:
[java] view plain copy
  1. public class Customer  
  2. {  
  3.     private  Person  person;  
  4.     public void setPerson(Person person) {  
  5.         this.person = person;  
  6.     }  
  7. }  
  8. public class Person {……}  

这时在配置文件当中默认autowire属性值为:no,即不使用默认装配,这时只有通过<ref>标签手动装配bean
[html] view plain copy
  1. <bean id="customer" class="cn.lovepi.***.Customer">  
  2.       <property name="person" ref="person" />  
  3. </bean>  
  4. <bean id="person" class="cn.lovepi.***.Person" />  

可以看到:person id的名字和customer bean的person属性的名字是一样的。

具体Spring属性注入请看:Spring学习(十七)Spring 参数注入方式介绍

其实,当Spring装配Bean的属性时,如果非常明确,则可以使用自动装配模式

Spring提供了4种各具特色的自动装配策略
  1. byName:把与bean的属性具有相同名字或者id的其他的bean自动装配到bean对应的属性当中。如果没有跟属性名字相匹配的bean,则该属性不进行装配。
  2. byType:把与bean的属性具有相同类型的其他bean自动装配到bean的对应属性当中。如果没有跟属性类型的bean,则属性不被装配。
  3. constructor:把与bean的构造函数入参具有相同类型的其他bean自动装配到bean的构造器对应的入参当中。
  4. autodetect:首先先将尝试使用constructor进行自动装配,如果失败,则尝试使用byType进行自动装配。

接下来详细的了解下这四种装配方式的优缺点。

1.byName:为属性自动装配与该属性名字相同的bean
       在Spring当中,所有的东西都会被赋予一个名字。因此,bean的属性也会有一个名字。就像装配进属性的bean一样,假如属性的名字恰好与该属性的bean的名字一样,那么只要配置了autowire属性,Spring便会自动将这个bean装配到属性当中去。
如下所示:
[html] view plain copy
  1. <bean  id="customer" class="cn.lovepi.***.Customer” autowire="byName/>  
  2. <bean  id="person" class="cn.lovepi.***.Person" />  
2.byType:为属性自动装配与该属性类型相同的bean
[html] view plain copy
  1. <bean id="customer" class="cn.lovepi.***.Customer” autowire="byType/>  
  2. <bean id="person" class="cn.lovepi.***.Person"  />  
当存在多个bean的类型与所要装配的属性类型相同的时候,Spring会抛出异常。
为了避免使用byType自动装配而带来的歧义,Spring为我们提供了两种解决方法:
  1. 可以为自动装配标志一个首选bean,使用primary属性,属性的默认值为true即所有的bean都是首选bean
  2. 可以取消某个bean自动装配的资格,使用autowire-candidate属性,为false时取消自动装配资格

3.constructor:通过构造器注入来配置bean,取消constructor-arg属性,使用autowire属性设置
[html] view plain copy
  1. <bean id="customer" class="com.jike.***.Customer” autowire=“constructor" />  
  2. <bean id="person" class="com.jike.***.Person"  />  

采用constructor构造器注入bean也具有一定的局限性
       当发现多个bean匹配某个构造器入参的时候,Spring不会去猜测哪一个bean更适合装配。此外,如果一个类有多个构造器,那么他们都满足自动装配的条件的时候,Spring也不会尝试去猜测哪一个构造器更适合使用。
4.autodetect:最佳自动装配策略
[html] view plain copy
  1. <bean id="customer" class="com.jike.***.Customer” autowire=“autodetect" />  
  2. <bean id="person" class="com.jike.***.Person"  />  

首先先将尝试使用constructor进行自动装配,如果失败,则尝试使用byType进行自动装配。
当Spring要为它所创建的所有Bean应用相同的自动装配策略来简化配置时,可以在根元素<bean>上增加一个default-autowire属性:
[html] view plain copy
  1. <beans     
  2.    xmlns="http://www.springframework.org/schema/beans"  
  3.    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  4.    xsi:schemaLocation="http://www.springframework.org/schema/beans  
  5.    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd”  
  6.    default-autowire=“byType”  >  
  7.    …………………  
  8. </beans>  
当我们对某个Bean选择了自动装配策略时,仍然可以为任意一个属性配置<property>属性,即可以同时使用自动装配显式装配策略:
[html] view plain copy
  1. <bean id="customer" class="com.jike.***.Customer“autowire=“byType" >  
  2.       <property name="person" ref="person1" />  
  3. </bean>  
  4.  <bean id="person"      class="com.jike.***.Person" />  
  5.  <bean id="person1"   class="com.jike.***.Person" />  
可以看到我们已经设置了按找类型自动装配bean,但我们也可以显式的使用property属性来加载特定的bean
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值