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

来源:互联网 发布:中国移动宽带测速软件 编辑:程序博客网 时间:2024/05/16 07:10

通过前面两章的介绍,我们对构造注入有个比较具体的体会,今天学习的是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;}@Overridepublic 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注入的方式会更多一些。

原创粉丝点击