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(); } }
所谓的注入:就是往接口里面放入一个实现,而这个实现不是这个人生成的时候就已经具备的,而是由这个人去控制选择实现,也就是控制反转,控制实现哪个被反转了,不再有生成人的那一刹那决定,而是把控制权放到了人生成后需要什么就实现什么
扩展:
接口:(我觉得下面的解释会比较清楚)
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(); } }