欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Spring的自动装配Bean的三种方式

程序员文章站 2024-03-06 15:25:44
spring的自动装配功能的定义:无须在spring配置文件中描述javabean之间的依赖关系(如配置

spring的自动装配功能的定义:无须在spring配置文件中描述javabean之间的依赖关系(如配置<property>、<constructor-arg>)。ioc容器会自动建立javabean之间的关联关系。

如果没有采用自动装配的话,手动装配我们通常在配置文件中进行实现:一下代码就是手动装配:

<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"> 
 
  <bean id="customerdao" class="com.hebeu.customer.dao.jdbccustomerdao"> 
    <property name="datasource" ref="datasource" /> 
  </bean> 
 
</beans> 

通过<property name="datasource" ref="datasource" />向customerdao的bean中注入了datasource

在spring框架,可以用 auto-wiring 功能会自动装配bean。要启用它,只需要在 <bean>定义“autowire”属性。

<bean id="customer" class="com.yiibai.common.customer" autowire="byname" />

在spring中,支持 5 自动装配模式。

  • no – 缺省情况下,自动配置是通过“ref”属性手动设定
  • byname – 根据属性名称自动装配。如果一个bean的名称和其他bean属性的名称是一样的,将会自装配它。
  • bytype – 按数据类型自动装配。如果一个bean的数据类型是用其它bean属性的数据类型,兼容并自动装配它。
  • constructor – 在构造函数参数的bytype方式。
  • autodetect – 如果找到默认的构造函数,使用“自动装配用构造”; 否则,使用“按类型自动装配”。【在spring3.0以后的版本被废弃,已经不再合法了】

第一种自动装配【根据属性名称自动装配】

package com.hebeu.model; 
 
public class customer { 
 
  private address address; 
   
  public customer() { 
     
  } 
   
  public customer(int id, address address) { 
    super(); 
    this.address = address; 
  } 
 
  public address getaddress() { 
    return address; 
  } 
 
  public void setaddress(address address) { 
    this.address = address; 
  } 
   
} 

package com.hebeu.model; 
 
public class address { 
 
  private string fulladdress; 
   
  public address(){ 
     
  } 
   
  public address(string addr){ 
    this.fulladdress = addr; 
  } 
 
  public string getfulladdress() { 
    return fulladdress; 
  } 
 
  public void setfulladdress(string fulladdress) { 
    this.fulladdress = fulladdress; 
  } 
   
} 

<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"> 
   
  <bean id="customer" class="com.hebeu.model.customer" autowire="byname"></bean>
   
  <bean id="address" class="com.hebeu.model.address"> 
    <property name="fulladdress" value="yilong road, ca 188"></property> 
  </bean> 
   
</beans>  

这样就将address注入到customer中。这就是自动注入byname.在customer bean中公开了一个属性address,spring容器会找到address bean,并且装配。这里必须要注意,customer中要被注入的bean的set方法要求必须是public的,否则会报空指针异常。还有配置的bean的id必须和customer中声明的变量名相同。

第二种自动装配【根据数据类型自动装配】

声明的俩个bean同样为customer以及address,将applicationcontext.xml转换为这样的就是实现根据数据类型进行自动装配。

<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"> 
   
  <bean id="customer" class="com.hebeu.model.customer" <strong><span style="color:#ff0000;">autowire="bytype"</span></strong>></bean> 
   
  <bean id="bean1" class="com.hebeu.model.address"> 
    <property name="fulladdress" value="yilong road, ca 188"></property> 
  </bean> 
</beans>  

类型自动装配的意思是如果一个bean的数据类型与其他的bean属性的数据类型相同,将会自动兼容装配它。当然要求只能配置一个某一个类型的bean.如果配置成这样,那么是会出错的。

<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"> 
   
  <bean id="customer" class="com.hebeu.model.customer" autowire="bytype"></bean> 
   
  <bean id="bean1" class="com.hebeu.model.address"> 
    <property name="fulladdress" value="yilong road, ca 188"></property> 
  </bean> 
  <bean id="bean2" class="com.hebeu.model.address"> 
    <property name="fulladdress" value="yilong road, ca 188"></property> 
  </bean> 
</beans>  

第三种自动装配【根据构造方法自动装配】

案例同上,将applicationcontext.xml转换为如下,就实现了按照构造方法自动装配:

<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"> 
   
  <bean id="customer" class="com.hebeu.model.customer"> 
    <!-- 构造方法的参数 --> 
    <constructor-arg> 
      <ref bean="bean1"/> 
    </constructor-arg> 
  </bean> 
   
  <bean id="bean1" class="com.hebeu.model.address"> 
    <property name="fulladdress" value="yilong road, ca 188"></property> 
  </bean> 
   
</beans> 

 它实际上是构造函数的参数类型自动装配。这意味着如果一个bean的数据类型与其他bean的构造器参数的数据类型是相同的,那么就自动装配。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。