首页 > 代码库 > Spring中的IOC

Spring中的IOC

    

在学习spring的时候,最常听到的词应该就是IOC和AOP了,以下,我从我的角度再次理解一下Spring里的IOC和AOP.


IOC简单介绍

    IoC(InversionofControl):IoC就是应用本身不依赖对象的创建和维护而是交给外部容器(这里为spring),这要就把应用和对象之间解耦,控制权交给了外部容器。

即Don‘tcallme,I‘llcallyou!所以IoC也称DI(依赖注入)对象的创建和维护依赖于外部容器.

IOC具体解释

    关于IOC的博客有非常多,我们能够从这篇博客中了解一下:

    深入浅出Spring(二)IoC具体解释

简单理解IOC

    我们从文章中发现,事实上ioc所做的一件事情就是把A和B的强耦合关系,变成A依赖于B的接口的关系,但详细A要实现B接口中哪一种B类型,由C来决定,以达到解耦,通俗来讲,我们在家到饭点的时候就会说“我要吃饭”,我这里代表的是A,饭代表的是B的接口,可是详细是要吃什么饭。那就由你的妈妈在决定,你妈妈给你在碗里放了米饭(B)。你就要吃米饭,当然,今天你妈妈开心。也能够给你碗里放一个鸡腿,这个决定权在你的妈妈。也就是我们常说的把控制权交给第三方。

一次来达到我(A)和米饭(B)的解耦。

DI与IOC 的关系

    我们可能会常常听到还有一个词:DI,这里,简单的做一下解说:

    由于IOC确实不够开门见山,因此业界曾进行了广泛的讨论,终于软件界的泰斗级人物MartinFowIer提出了DI(依注入:Dependency Injection)的概念用以取代loc,即让调用类对某一接口实现类的依赖关系由第三方(容器或协作类)注入,以移除调用类对某一接口实现类的依赖。

“依賴注入”这个名词显然比“控制反转”直接明了、易于理解。

    所以,我觉得IOC和DI描写叙述的是一件事情,仅仅是从不同的角度来描写叙述:

    IOC控制反转:说的是创建对象实例的控制权从代码控制剥离到IOC容器控制。实际上就是我们如今说的第三方。側重于原理。

    DI依赖注入:说的是创建对象实例时,为这个对象注入属性值或其他对象实例,側重于实现。

说到DI,可能就会有出现这样一个问题。既然DI側重实现,那么他是怎么实现的呢?也就是怎么注入的呢?以下我们

几种注入方式:

    简单说一下几种注入方式:

    第一种:构造函数注入(这里我们直接沿用上面的样例):

  

       publicclass Team { 
         privateLeader leader;
         publicTeam(Leader leader){
                   this.leader=leader;
}
             public void firstMetting(){ 
                 leader.introduce(); 
             } 
         }   
在Boss出的代码为:
public class Boss {  
   public void direct(){ 
       Leader leader = new Li(); 
       Team team = new Team(leader); 
       team.firstMetting(); 
} 

 另外一种:属性注入:

    有时,我们会发现,尽管小李在这个team里要发言,。但并不是每次都要发言,在这样的情况下通过构造函数注入并不妥当,这时能够考虑使用属性注入。

属性注入能够有选择地通过setter方法完毕调用类所需依赖的注入,更加灵活方便。

public class Team { 
         privateLeader leader。
         publicvoid SetLeader (Leader leader){
                   this.leader=leader;
}
             public void firstMetting(){ 
                 leader.introduce(); 
             } 
         }   
在Boss出的代码为:
public class Boss { 
   public void direct(){ 
       Leader leader = new Li(); 
       Team team = new Team(); 
                   Team.setLeader(leader);
       team.firstMetting(); 
} 


    和通过构造函数注入不同。在实例化Team时。并未指定不论什么发言人,而是在实例化Team后,在须要小李出场时。才调用其setLeader方法注入扮演者。依照类似的方式。这样。我们就能够在不同的场合。注入对应的发言人了。

 

第三种:接口注入:

定义接口:
Public interface teamInject{
         voidinjectLeader(Leader leader);
}
public class Team implements teamInject { 
         privateLeader leader。
         publicvoid injectLeader (Leader leader){
                   this.leader=leader;
}
             public void firstMetting(){ 
                 leader.introduce(); 
             } 
         }   
在Boss出的代码为:
public class Boss { 
   public void direct(){ 
       Leader leader = new Li(); 
       Team team = new Team(); 
                   Team.setLeader(leader);
       team.firstMetting(); 
} 


    因为通过接口注入须要额外声明一个接口,添加了类的数目。并且它的效果和属性注

    入并无本质差别,因此我们不提倡採用这样的方式。

Spring中实现IOC

   当然,在这个样例中。我们是通过手动维护第三方类的,那么,Spring容器是怎么实现的呢?

    spring容器实现的方法网上也有非常多,在这里,我就直接站在巨人的肩膀上了:

   手动模拟IOC

 

    事实上,在Spring容器中,容器仅仅是把第三方这个类对外封装成一个xml节点,在容器中进行查询注入,注意。这里用到两个很重要的技术,一个是查找XML,还有一个是依据方法名利用反射机制调用类。我感觉假设以后想写出好的程序,这两个技术是不可缺少的。

 

IOC就说到这里。以下讲一下我对AOP的理解:Spring中的AOP

Spring中的IOC