Spring IOC(控制反转)和DI(依赖注入)

1. IOC: Inversion of Control. 控制反转。

传统的编程方式: 所有的对象和资源都是由开发人员来控制,由你来决定什么时候new一个对象,什么时候申请资源、使用资源、释放资源。

控制:指控制外部资源的获取,控制对象生命周期。

反转: 刚开始流行的是由开发人员操纵一切,现在变了,由Spring框架来控制程序中的外部资源、控制对象的生命周期等。所以取名“反转”,即控制的权利由开发人员转移到了Spring框架。由Spring框架帮我创建我们对象中依赖的对象,我们的对象只能被动的接受。

IOC的好处就是解耦,对象和对象之间的耦合度变低了,便于测试、便于功能复用。


2. DI(Dependency Injection)翻译成中文叫做“依赖注入”,既然对象的整个生命周期都是由Spring框架来维护的,那么我的这个对象中引用了另一个对象,你打算怎么办?Spring框架自然考虑到这一点了。“依赖注入”这两个词语也要拆开来讲:

依赖: 我的A对象中引用了B对象,也就是说A对象依赖B对象。你要通过配置文件告诉Spring你的对象之间的依赖关系

注入: 你的对象已经交给Spring管理了,你也告诉Spring你的对象之间的依赖关系了,那么在合适的时候,由Spring把你依赖的其他对象(或者资源、常量等)注入给你

总结就是,把所有的控制权交给Spring,由Spring帮你创建对象、帮你维护对象之间的依赖关系

扫描二维码关注公众号,回复: 197606 查看本文章



3、控制反转和依赖注入之间的关系

控制反转(Inversion Of Control, IOC)是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。其中最常见的方式叫做依赖注入(Dependency Injection, DI), 还有一种叫”依赖查找”(Dependency Lookup)。通过控制反转,对象在被创建的时候,由一个调控系统内所有对象的外界实体,将其所依赖的对象的引用传递给它。也可以说,依赖被注入到对象中。

4.为什么需要IOC和DI

  为什么要有依赖注入(一种设计代码模式)? 因为我们要控制反转(设计代码的思路)。

为什么控制反转?因为我们软件设计需要符合软件设计原则依赖倒置(设计代码原则),单一职责原则。

说通俗点就是咱们要解耦啊。MVP模式就是解耦比较全面的设计模式模型,

5.依赖注入一般有1.构造注入 2.接口注入 3.设值注入。

  Spring不使用接口注入(违反Spring声称的非入侵原则(没有它一样活))。使用设值注入。

  设值注入是指通过setter方法传入被调用者的实例。这种注入方式简单、直观,因而在Spring依赖注入里大量使用。

   实例:  

   //这是一个Person的接口

    public interface Person {

        //一个使用斧头的方法(抽象方法,未实现)
        public void UseAxe ();

    }

   //定义一个Axe的接口

   public interface Axe {

        //斧头有个砍Chop的方法

        public void Chop();

   }

 //Axe的一个实现类石斧StoneAxe

 publice class StoneAxe implements Axe {

     //默认构造方法
    public StoneAxe(){

    }

    //实现Axe接口的砍方法

    public String Chop () {

        return  “石斧砍”;
   }

}

 
  //Person的实现类中国人Chinese

  public class Chinese implements Person {

      //面向斧头的接口Axe编程,而不是实现类
      private Axe axe;

      //默认的构造方法

     public Chiniese() {

     }

     //设值注入所需的setter方法

     public void setAxe (Axe axe) {

         this.axe = axe;
     }

     //实现Person接口的使用斧头的方法

     publice void UseAxe {
       System.out.println(axe.Chop());

     }



  }

接下来使用spring的配置文件将人Person的实现类Chinese和斧头Axe的实现类StoneAxe联系起来。

<!-- 下面是标准的XML文件头 -->
<?xml version="1.0" encoding="gb2312"?>
<!-- 下面一行定义Spring的XML配置文件的dtd -->
"http://www.springframework.org/dtd/spring-beans.dtd">
<!-- 以上三行对所有的Spring配置文件都是相同的 -->
<!-- Spring配置文件的根元素 -->
<BEANS>
    <!—定义第一bean,该bean的id是chinese, class指定该bean实例的实现类 -->
    <BEAN class=lee.Chinese id=chinese>
        <!-- property元素用来指定需要容器注入的属性,axe属性需要容器注入此处是设值注入,因此Chinese类必须拥有setAxe方法 -->
        <property name="axe">
            <!-- 此处将另一个bean的引用注入给chinese bean -->
            <REF local="”stoneAxe”/">
        </property>
</BEAN>
<!-- 定义stoneAxe bean -->
<BEAN class=lee.StoneAxe id=stoneAxe />
</BEANS>

下面是主程序部分:

public class PersonTest{
  //主方法,程序的入口
  public static void main (String[] args) throw exception {
     //因为是独立的应用程序,这里显示的实例化Spring的上下文
     ApplicationContext ctx = new FileSystemXmlApplicationContext("bean.xml");
     //通过Person的bean的id来获取bean实例,面向接口编程,因此此处强制转换为接口类
     Person p = (Person)ctx.getBean("chinese");
     //直接执行Person的UseAxe方法
     p.UseAxe();
  }
}

上面程序执行结果: 石斧砍


*转自:          https://www.cnblogs.com/xxzhuang/p/5948902.html

                       https://blog.csdn.net/u011068996/article/details/76445379

                       https://blog.csdn.net/qin_zhimou/article/details/52662123

                      https://blog.csdn.net/baoendemao/article/details/24634835 *详解spring的四种依赖注入方式




猜你喜欢

转载自blog.csdn.net/xboy100824/article/details/79866389