Document

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方法注入一个实例

 

 

 

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

posted @ 2016-10-13 17:39  丶丿Jeffrey  阅读(6479)  评论(0编辑  收藏  举报
Lovely♪