Spring--2.依赖注入

1.Spring核心机制

依赖----A对于像依赖B对象的方法;

核心机制----控制反转(IoC),别名:依赖注入

        程序无需主动获取被依赖的对象,只等Spring容器注入。(property子元素和对应的setter方法)

2.依赖注入

依赖注入的两种方式:

  1. 设值注入:IoC容器使用成员变量的setter方法注入被依赖的对象。
  2. 构造注入:IoC容器使用构造器注入。
注意:Spring推荐使用面向接口编程,不管是调用者还是被依赖的对象,都应该为之定义接口,而不是面向实现类编程,这样以便程序的后期升级维护。
但是xml中的class配置,必须要写实现类。因为要通过反射出对象。

2.1设置注入

例如,我们为《Spring--1》中的Person、Axe都定义一个接口
接口:
package codeEETest;
public interface Person
{
	// 定义一个使用斧子的方法
	public void useAxe();
}
接口:
package codeEETest;
public interface Axe
{
	// Axe接口里有个砍的方法
	public String chop();
}
实现类:
package codeEETest;

public class Chinese implements Person
{
	private Axe axe;
	// 设值注入所需的setter方法
	public void setAxe(Axe axe)
	{
		this.axe = axe;
	}
	// 实现Person接口的useAxe方法
	public void useAxe()
	{
		// 调用axe的chop()方法,
		// 表明Person对象依赖于axe对象
		System.out.println(axe.chop());
	}
}
Axe实现类1:
package codeEETest;

public class StoneAxe implements Axe
{
	public String chop()
	{
		return "石斧砍柴好慢";
	}
}
Axe实现类2:
package codeEETest;

public class SteelAxe implements Axe
{
	public String chop()
	{
		return "钢斧砍柴真快";
	}
}
xml:(当有不同的实现类时,只需要在xml中改注入的对象即可)
	<!-- 配置名为person的Bean,其实现类是...类 -->
	<bean id="person" class="codeEETest.Chinese">
		<!-- 控制调用setAxe()方法,将容器中axe Bean作为传入参数 -->
		<property name="axe" ref="stoneAxe"/>
	</bean>
	
	<!-- 配置名为axe的Bean,其实现类是...类 -->
	<bean id="stoneAxe" class="codeEETest.StoneAxe"/>


2.2构造注入

本质:Spring在底层以反射的方式执行带指定参数的构造器。<constructor-arg.../>子元素。

        <!-- 配置名为person的Bean,其实现类是...类 -->
	<bean id="person" class="codeEETest.Chinese">
		<!-- 控制调用setAxe()方法,将容器中axe Bean作为传入参数 -->
		<constructor-arg ref="steelAxe" />
	</bean>
	
	<!-- 配置名为axe的Bean,其实现类是...类 -->
	<bean id="stoneAxe" class="codeEETest.StoneAxe"/>
允许有type属性,指明参数的类型。<constructor-arg ref="steelAxe" type="org.crazyit.app.service.Axe"/>。
例如value="23",允许当成int,这时type="int".

建议设值注入为主,构造注入为辅。对于依赖无需变化的注入,尽量构造注入;依赖其他关系的注入,尽量设值注入。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值