zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    基本排序
    mysql安装
    函数和方法
    COOKIE 与 SESSION
    django---入门
    django模板继承
    2017-11-14
    Django---模板层(template)
    Dajngo---model基础
    Django--基础篇
  • 原文地址:https://www.cnblogs.com/wzjhoutai/p/6749007.html
Copyright © 2011-2022 走看看