1.1.1 Spring里面的依赖注入思想

1.spring,他的目的就是简化java 的编写工作

例子1:

public class PersonOfOnlySingingASong extends Person {
	private SingASongImpl sing;
	
	public	PersonOfOnlySingingASong(){
		sing = new SingASongImpl();
	}
	
	public void singOnQuest() {
		sing.singASong();
	}
}



上面的例子在PersonOfOnlySinging运行构造方法的时候,就已经把sing这个类生成了实例,这样其实是很难进行单元测试与重用,这个人只能唱A这首歌,唱其他的就不行了,简单的说耦合太高了,两个类紧紧相依,无法分开。

由于上面的例子不便于测试(因为每次测试都需要保证SingASong的实现)还有不便于重用,所以产生了下面的例子

例子2:

public class PersonOfNotOnlySingingASong extends Person {
	private ISing sing;
	
	public	PersonOfNotOnlySingingASong(ISing sing){
		this.sing = sing;
	}
	
	public void singOnQuest() {
		sing.singASong();
	}
	
	public static void main(String[] args) {
		PersonOfNotOnlySingingASong temp= new PersonOfNotOnlySingingASong(new SingASongImpl());
		temp.singOnQuest();
	}
}




所谓的注入:就是往接口里面放入一个实现,而这个实现不是这个人生成的时候就已经具备的,而是由这个人去控制选择实现,也就是控制反转,控制实现哪个被反转了,不再有生成人的那一刹那决定,而是把控制权放到了人生成后需要什么就实现什么


在上面的例子里面,我们引入接口ISing,SingASongImpl现在就变成只是ISing的一个实现,也许我们会有其他的实现(如:SingBSong等),这样,Person就不单单只是唱一首歌,而是变成(或者说是抽象成)一种能力“唱歌”,这个人会唱歌,这是一个抽象(也是平常说的接口),他不一定唱A这首歌,还可以唱其他歌曲,只有有其他歌曲的实现,他照样能够唱出来。所以,上面的例子体现了Spring里面其中一种注入方式:构造器注入


扩展:

接口:(我觉得下面的解释会比较清楚)

interface就是一种介面﹐规定欲沟通的两物件(平常说的对象Object的另外一个说法)﹐其通讯该有的规范有哪些。一些函数或资料成员﹐为另一些属于不同类别的物件所需共同拥有﹐则将这些函数与资料成员﹐定义在一个interface中﹐然后让所有不同类别的Java物件(平常说的对象Object的另外一个说法)可以共同操作使用之。


如果我在上面的例子中还不满意那个人只能唱歌,我就可以再定义一个空接口IDo(定义这个人可以做事情,唱歌只是Do里面的其中一部分,Sing继承Do)

例子:

public class PersonOfDo extends Person {
	private IDo domainOfDo;
	
	public	PersonOfDo(IDo doThing){
		this.domainOfDo = doThing;
	}
	
	public void doOnQuest() {
		domainOfDo.doThing();
	}
	
	public static void main(String[] args) {
		SingASongImpl singASongImpl = new SingASongImpl();
		PersonOfDo personOfDo = new PersonOfDo(singASongImpl);
		personOfDo.doOnQuest();
	}
}





版权声明:本文为博主原创文章,未经博主允许不得转载。

posted on 2014-10-23 08:37  李灵晖  阅读(252)  评论(2编辑  收藏  举报