spring(7)------Bean的5种自动装配模式

spring配置bean中,自动装配可以指定给一个单独的bean,而一些类不使用自动装配,减少开发时对属性的设置。

对于自动装配,有5种模式:byName,byType,constructor,autodetect和no

一,byName自动装配模式

byName模式,通过bean的name属性进行自动装配,在spring配置中,查找一个与属性名相同的bean。

用实例解释:

创建自动装配类HelloWorld和被装配类RefTest:

HelloWorld类:

package com.lanhuigu.spring.action;


public class HelloWorld{
	private String msg;
	private RefTest refTest;
	/*public HelloWorld(RefTest refTest){
		this.refTest = refTest;
	}*/
	//通过set方法注入属性值
	public void setMsg(String msg) {
		this.msg = msg;
	}
	
	public String getMsg() {
		return msg;
	}

	public RefTest getRefTest() {
		return refTest;
	}

	public void setRefTest(RefTest refTest) {
		this.refTest = refTest;
	}
	
}

RefTest类:

package com.lanhuigu.spring.action;

public class RefTest {
	private String myRef;

	public String getMyRef() {
		return myRef;
	}

	public void setMyRef(String myRef) {
		this.myRef = myRef;
	}
	
}

spring配置:

<?xml version="1.0" encoding="UTF-8"?>

<!--
  - Application context definition for JPetStore's business layer.
  - Contains bean references to the transaction manager and to the DAOs in
  - dataAccessContext-local/jta.xml (see web.xml's "contextConfigLocation").
  -->
<beans xmlns="http://www.springframework.org/schema/beans"
		xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
		xmlns:aop="http://www.springframework.org/schema/aop"
		xmlns:tx="http://www.springframework.org/schema/tx"
		xsi:schemaLocation="
			http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
			http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
			http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
	<!-- 定义一个id为sayHello的bean,
	通过spring配置文件变换实现类,实现不同的功能,无需修改别的程序 -->
	<bean id="sayHello" class="com.lanhuigu.spring.action.HelloWorld" autowire="byName">
		<!-- 将变量msg值依赖注入 -->
		<property name="msg">
			<value>测试</value>
		</property>
		<!-- refTest为HelloWorld的一个属性,通过ref指定依赖关系,
			也就是说你依赖于哪个类,或者接口,直接把这个类通过set方式注入 ,
			看看HelloWorld的属性定义就明白了-->
		<!-- <property name="refTest">
			<ref bean="ref"/>
		</property> -->
	</bean>
	<!-- RefTest类 -->
	<bean id="refTest" class="com.lanhuigu.spring.action.RefTest">
		<!-- myRef为RefTest类的一个属性 -->
		<property name="myRef">
			<value>依赖关系测试</value>
		</property>
	</bean>
</beans>

测试代码:

package com.lanhuigu.spring.test;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.lanhuigu.spring.action.HelloWorld;

public class TestHelloWorld {
	@Test
	public void testMyHelloWorld(){
		//1.读取spring初始化的配置文件
		ApplicationContext acxt = 
				new ClassPathXmlApplicationContext("/applicationContext.xml");
		//2.根据bean获取ISayHello实现类对象
		HelloWorld hello = (HelloWorld) acxt.getBean("sayHello");
		//3.调用接口方法
		System.out.println(hello.getMsg());
		//先获取依赖的类RefTest,在从依赖类中获取依赖类的属性
		System.out.println(hello.getRefTest().getMyRef());
	}
}

关于byName自动装配模式代码解释:

在HelloWorld类中,定义有一个属性private RefTest refTest,在spring配置中通过autowire="byName"配置自动装配模式,

HelloWorld类在spring中查找refTest的bean将RefTest类自动装配到HelloWorld类中,替换掉先前的通过ref手动配置关联关系。


二,byType自动装配模式

byType就是根据类的属性类型,去spring配置文件中查找相同类型的bean。

将上述代码spring配置中的autowire="byName"替换成autowire="byType",

HelloWorld类去spring配置文件中查找RefTest类型的bean,装配到HelloWorld中,

如果查找到两个及以上RefTest类型的bean,将报错,也就是说,只能装配一个同一类型的bean

三,constructor自动装配模式

通过构造函数的参数类型进行自动装配。

HelloWorld代码加一个有参构造器:

package com.lanhuigu.spring.action;


public class HelloWorld{
	private String msg;
	private RefTest refTest;
	//有参构造器
	public HelloWorld(RefTest refTest){
		this.refTest = refTest;
	}
	//通过set方法注入属性值
	public void setMsg(String msg) {
		this.msg = msg;
	}
	
	public String getMsg() {
		return msg;
	}

	public RefTest getRefTest() {
		return refTest;
	}

	public void setRefTest(RefTest refTest) {
		this.refTest = refTest;
	}
	
}
spring配置修改成autowire="constructor",其他都不变,通过构造器自动装配成功,

值得注意的是,构造器参数是根据参数类型去spring配置文件中查找bean的,

而不是根据bean的refTest去查找,可以把refTest修改成别的id,也能通过构造器自动

装配将RefTest装配到HelloWorld中。

四,autodetect自动装配模式

该模式自动选择constructor或byType装配,优先选择constructor,如果没有配置constructor,则选择byType自动装配。

五,no模式

spring默认情况下,就是no模式,也就是说不使用自动装配,我们想引用哪个bean,以及bean之间的关系通过

ref参考引用进行配置:

<?xml version="1.0" encoding="UTF-8"?>

<!--
  - Application context definition for JPetStore's business layer.
  - Contains bean references to the transaction manager and to the DAOs in
  - dataAccessContext-local/jta.xml (see web.xml's "contextConfigLocation").
  -->
<beans xmlns="http://www.springframework.org/schema/beans"
		xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
		xmlns:aop="http://www.springframework.org/schema/aop"
		xmlns:tx="http://www.springframework.org/schema/tx"
		xsi:schemaLocation="
			http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
			http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
			http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
	<!-- 定义一个id为sayHello的bean,
	通过spring配置文件变换实现类,实现不同的功能,无需修改别的程序 -->
	<bean id="sayHello" class="com.lanhuigu.spring.action.HelloWorld">
		<!-- 将变量msg值依赖注入 -->
		<property name="msg">
			<value>测试</value>
		</property>
		<!-- refTest为HelloWorld的一个属性,通过ref指定依赖关系,
			也就是说你依赖于哪个类,或者接口,直接把这个类通过set方式注入 ,
			看看HelloWorld的属性定义就明白了-->
		<property name="refTest">
			<ref bean="ref"/>
		</property> 
	</bean>
	<!-- RefTest类 -->
	<bean id="refTest" class="com.lanhuigu.spring.action.RefTest">
		<!-- myRef为RefTest类的一个属性 -->
		<property name="myRef">
			<value>依赖关系测试</value>
		</property>
	</bean>
</beans>
HelloWorld类通过ref指定依赖的bean,不使用自动装配


关于自动装配的总结:

在实际应用中,不使用自动装配,因为自动装配去除了依赖的透明性和清晰性,所以尽量不用自动装配。

你可能感兴趣的:(Constructor,byname,byType,自动装配模式,autodetect)