Spring的自动装配Bean

  • Post author:
  • Post category:其他


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" autowire="byType"></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的构造器参数的数据类型是相同的,那么就自动装配。



版权声明:本文为qq_28663043原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。