zoukankan      html  css  js  c++  java
  • Spring IoC原理详解

      去掌握一门技术的时候,往往很多人都忽略了一点,只是一味地去写代码,原理层面的东西从来就不理会

    还有就是学习的过程中,不去想为什么有了当前的写法,却有着这么一门技术可以代替它

      一般来说,在写程序的时候,一个类的实例创建都是直接通过 new className(); 语法来操作。说真的,

    我写程序代码都不这么去做,我只需要在程序里定义一个接口类型的属性,直接通过属性来调用接口的方法

    java代码:

     1 public class Girl_1 implements Girl {
     2     
       //定义一个接口类型的属性
        private Dog dog; 3
        //定义该属性的set方法,让Spring来调用 4 public void setDog(Dog dog) { 5 this.dog = dog; 6 } 7 8 @Override 9 public void playDog() { 10 // TODO Auto-generated method stub 11 //调用方法,实际上是调用接口的方法
          dog.bark();
    12 }
      }

      接口的实例来自于哪个Class类,在写代码的时候根本不用去理会,只需要在SpringXml配置文件中配置一下就可以了

    Spring会自动的找到ClassBean_property所引用的类实例,调用Class类中属性的set方法注入一个Class类实例

    xml代码:

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <beans>
     3     <!-- 一个bean就是一个类的实例 -->
     4     <bean id="girl" class="springAop.Girl_1" scope="prototype">
     5     
     6         <property name="dog" ref="labrador" />
     7         <!-- 图_3所示的接口类型的dog属性 -->
     8         
     9     </bean>
    10     
    11     <!-- 通过property标签的ref属性,引用一个类的实例labrador -->
    12     <bean id="labrador" class="springAop.Labrador" scope="prototype" />    
    13     
    14     <bean id="shepherdDog" class="springInject.ShepherdDog" scope="prototype" />
    15 
    16 </beans>    

       这里就涉及到IoC了,Inversion Of Control (控制反转),这让很多人不解,被控制的是谁,反转指的又是什么,举一反三,有反转就有正转

      梦逸来告诉大家

      其实IoC真正意义上是[资源提供者],互联网上所说的控制反转中的控制也并不是一个动作,只是一个名词,所以大家不要弄混了

      Spring的xml配置文件就相当于是一个容器,它托管着整个程序中的Class类实例,通过在xml文件中定义一个bean,(上文xml代码所示)

      bean标签指定一个Class类,然后在bean节点中的property标签指定Class类定义的接口类型的属性,通过property标签的ref属性指定一个bean标

      签的id,注入一个实例给Class类中的属性。

      (PS1:一个bean就是一个类的实例;一个property就是Class类中定义的接口类型属性)

      (PS2:property的ref属性指定ClassBean的id,注入一个Class类实例给Class类中定义的接口类型属性)

     

       下面梦逸附上一张图帮助大家理解反转是怎么一回事

      上图就是反转的大致解释了,写程序的时候,一般的代码都是直接的定义一个属性,然后直接创建一个实例并赋值:Girl girl = new Girl_2();

      IoC设计模式很人性化的实现了这一点,反过来了,使用Ioc设计模式,程序代码中不再出现 new Girl_2();这种new关键字的创建实例代码

      只需要在程序中定义一个属性,属性的值是null,也就是说不用赋值,然后添加该属性的set方法,让Spring调用该属性的set方法注入一个实例

      梦逸、原创,转载请注明原文地址

  • 相关阅读:
    [LeetCode] 1131. Maximum of Absolute Value Expression 绝对值表达式的最大值
    [LeetCode] 1130. Minimum Cost Tree From Leaf Values 叶值的最小代价生成树
    [LeetCode] 1129. Shortest Path with Alternating Colors 颜色交替的最短路径
    [LeetCode] 1128. Number of Equivalent Domino Pairs 等价多米诺骨牌对的数量
    [LeetCode] 1125. Smallest Sufficient Team 最小的必要团队
    [LeetCode] 1124. Longest Well-Performing Interval 表现良好的最长时间段
    [LeetCode] 1122. Relative Sort Array 数组的相对排序
    Gitalk 自动初始化评论
    [LeetCode] 1111. Maximum Nesting Depth of Two Valid Parentheses Strings 有效括号的嵌套深度
    [LeetCode] 1110. Delete Nodes And Return Forest 删点成林
  • 原文地址:https://www.cnblogs.com/LiJinfu/p/5957291.html
Copyright © 2011-2022 走看看