Spring之自动装配注入

Spring能自动装配Bean与Bean之间的依赖关系,即无须使用ref显示指定依赖Bean,而是由Spring容器检查XML配置文件内容,根据某种规则,为调用者Bean注入被依赖的Bean.当然,当一个Bean既使用自动装配依赖,又使用显示指定依赖时,则显示指定的依赖覆盖自动装配依赖。

1. byName规则

byName规则是指setter方法的方法名与Bean的id进行匹配,假如Bean A的实现类包含setB()方法,而Spring配置文件恰好包含id为b的Bean,则Spring容器会将b实例注入Bean A中。如果容器中没有名字匹配的Bean,Spring则不会做任何事情。

 <?xml version="1.0" encoding="GBK"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns="http://www.springframework.org/schema/beans"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
	http://www.springframework.org/schema/beans/spring-beans-4.0.xsd">
	<!-- 指定使用byName策略,Spring会根据setter方法的方法名与Bean的id进行匹配 -->
	<bean id="chinese" class="com.owen.app.service.impl.Chinese"
		autowire="byName"/>
	<bean id="gunDog" class="com.owen.app.service.impl.GunDog">
		<property name="name" value="wangwang"/>
	</bean>
</beans>

在Chinese的类中有如下的方法

 public class Chinese implements Person
{
	private Dog dog;
	// dog的setter方法
	public void setGunDog(Dog dog)
	{
		this.dog = dog;
	}
	}

所以在匹配时,去掉set的后面方法名第一个首字母要小写,即gunDog,正好与上面的xml文件中的第二个bean的id一样,所以就匹配上了。

2. byType规则

byType规则是根据setter方法参数类型与Bean的类型进行匹配。假如A实例有setB(B b)方法,而Spring的配置文件中恰好有一个类型为B的Bean实例,容器为A注入匹配的Bean实例,如果容器中没有类型为B的实例,Spring不会调用setB()方法;但如果容器包含多于一个B的实例,程序将会抛出异常。

<?xml version="1.0" encoding="GBK"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns="http://www.springframework.org/schema/beans"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
	http://www.springframework.org/schema/beans/spring-beans-4.0.xsd">
	<!-- 指定使用byType策略,Spring会根据setter方法的参数类型与Bean的类型进行匹配 -->
	<bean id="chinese" class="com.owen.app.service.impl.Chinese"
		autowire="byType"/>
<!-- GunDog 实现子Dog的接口-->
	<bean id="gunDog" class="com.owen.app.service.impl.GunDog">
		<property name="name" value="wangwang"/>
	</bean>
	<!-- 配置petDog Bean,其实现类也实现了Dog接口,程序报错 -->
	<bean id="petDog" class="com.owen.app.service.impl.PetDog"
		autowire-candidate="false">
		<property name="name" value="ohoh"/>
	</bean>

</beans>

3.总结

虽然自动配置可以减少配置文件的工作量,但大大降低了依赖关系的清晰性和透明性。所以不建议使用自动配置。





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值