Spring 5种自动装配模式注入bean

2019-04-19 23:34|来源: 网路

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

<bean id="customer" class="com.common.Customer" autowire="byName" />


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

  • no – 缺省情况下,自动配置是通过“ref”属性手动设定

  • byName – 根据属性名称自动装配。如果一个bean的名称和其他bean属性的名称是一样的,将会自装配它。

  • byType – 按数据类型自动装配。如果一个bean的数据类型是用其它bean属性的数据类型,兼容并自动装配它。

  • constructor – 在构造函数参数的byType方式。

  • autodetect – 如果找到默认的构造函数,使用“自动装配用构造”; 否则,使用“按类型自动装配”。


示例

Customer 和 Person 对象自动装配示范。

package com.common;

public class Customer 
{
	private Person person;
	
	public Customer(Person person) {
		this.person = person;
	}
	
	public void setPerson(Person person) {
		this.person = person;
	}
	//...
}


package com.common;

public class Person 
{
	//...
}


1. 根据beanId默认注入

这是默认的模式,你需要通过 'ref' 属性来连接 bean。

<bean id="customer" class="com.common.Customer">
                  <property name="person" ref="person" />
	</bean>

	<bean id="person" class="com.common.Person" />


2. 根据名称自动注入autowire="byName"

按属性名称自动装配。在这种情况下,由于对“person” bean的名称是相同于“customer” bean 的属性(“person”)名称,所以,Spring会自动通过setter方法将其装配 – “setPerson(Person person)“.

<bean id="customer" class="com.common.Customer" autowire="byName" />	
<bean id="person" class="com.common.Person" />


3. 根据类型自动注入autowire="byType"

通过按属性的数据类型自动装配Bean。在这种情况下,由于“Person” bean中的数据类型是与“customer” bean的属性(Person对象)的数据类型一样的,所以,Spring会自动通过setter方法将其自动装配。– “setPerson(Person person)“.

<bean id="customer" class="com.common.Customer" autowire="byType" />
<bean id="person" class="com.common.Person" />


4. 根据构造器注入autowire="constructor"

通过构造函数参数的数据类型按属性自动装配Bean。在这种情况下,由于“person” bean的数据类型与“customer” bean的属性(Person对象)的构造函数参数的数据类型是一样的,所以,Spring通过构造方法自动装配 – “public Customer(Person person)“.

<bean id="customer" class="com.common.Customer" autowire="constructor" />
	
	<bean id="person" class="com.yiibai.common.Person" />


5. Auto-Wiring ‘autodetect’

如果找到默认的构造函数,则使用“构造方法”; 否则,使用“byType”。在这种情况下,由于有默认的构造函数在“Customer”类,所以,Spring通过构造方法自动装配 – “public Customer(Person person)“.

<bean id=" customer"="" class="com.common.Customer" autowire="autodetect" >="" <bean="" id="person" >

相关问答

更多