Spring学习之——依赖注入(下)

通过前面两章的介绍,我们对构造注入有个比较具体的体会,今天学习的是Spring中最常用的Setter注入,这种注入方式我们在最开始学习的第一个示例程序中已经用到过,现在我们修改一下之前的程序,使其更全面的展示Setter注入的功能。
我们将前面的示例程序进行简单的修改

PonitA,在默认的构造函数中添加打印,同时将x,y的set方法添加进去

public class PointA {
	
	private int x;
	private int y;
	
	public PointA(){
		System.out.println("Called Default PonitA Constructor");
	}
	public PointA(int x, int y){
		this.x = x;
		this.y = y;
	}
	
	public int getX() {
		return x;
	}
	public void setX(int x) {
		this.x = x;
	}
	public void setY(int y) {
		this.y = y;
	}
	public int getY() {
		return y;
	}
	
	@Override
	public String toString() {
		return "PointA X:"+String.valueOf(x)+" Y:"+String.valueOf(y);
	}
}


PointB和PointA的改法相同这里就不贴出了
Line类的修改方式也和PointA类似,如下:

public class Line {

	private PointA pa;
	private PointB pb;
	
	public Line(){
		System.out.println("Called Default Line Constructor");
	}
	
	public Line(PointA pa, PointB pb){
		this.pa = pa;
		this.pb = pb;
	}

	public PointA getPa() {
		return pa;
	}

	public void setPa(PointA pa) {
		this.pa = pa;
	}

	public PointB getPb() {
		return pb;
	}

	public void setPb(PointB pb) {
		this.pb = pb;
	}

	// 计算两点间的距离
	public void distance(){
		int d1 = Math.abs(pb.getX()-pa.getX());
		int d2 = Math.abs(pb.getY()-pa.getY());
		System.out.println(Math.sqrt(d1*d1 + d2*d2));
	}
}

下面是修改配置文件bean.xml,由于是setter注入,配置文件修改如下:

<bean id="line" class="cn.com.spring.injection.bean.Line">
		<property name="pa" ref="pointa"/>
		<property name="pb" ref="pointb"/>
	</bean>
	<bean id="pointa" class="cn.com.spring.injection.bean.PointA">
		<property name="x" value="4"/>
		<property name="y" value="8"/>
	</bean>
	<bean id="pointb" class="cn.com.spring.injection.bean.PointB">
		<property name="x" value="4"/>
		<property name="y" value="10"/>
	</bean>


测试程序不需要做任何的修改,运行结果:
Called Default Line Constructor
Called Default PonitA Constructor
Called Default PonitB Constructor
PointA X:4 Y:8
PointB X:4 Y:10
2.0

从结果可以看出,Spring在构造对象时没有调用重载的构造方法而是采用了默认的构造方法,通过前面的学习,我们可以对构造注入和setter注入这两种方式做一个对比,通过示例程序实验我们可以发现使用构造注入的时候,类的所有属性的初始化都是在构造器里完成的,Spring在初始化的时候,调用的是重载后的构造方法,因此类初始化完成之时,依赖关系也随着一并建立。setter注入是通过调用对象中的set方法进行的,所以Spring在初始化的时候对象可以先于依赖关系的注入而产生。简单的说对象已经构造出来了,依赖关系此时不一定被注入。对于构造注入的方式如果依赖关系比较复杂,将会使得构造配置过于臃肿从而难以阅读,Spring初始化bean的时候需要对所有的依赖关系进行初始化因而也会更加费时,效率也会打折扣,相比之下由于setter注入更符合传统JavaBean的书写规则,配置文件的书写也能够使开发者思路更清晰,依赖关系的体现更加直观,明显。阅读起来也更容易理解。所以一般的开发当中采用setter注入的方式会更多一些。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值