Spring IoC原理详解

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

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

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

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

java代码:

 public class Girl_1 implements Girl {

   //定义一个接口类型的属性
    private Dog dog;

    //定义该属性的set方法,让Spring来调用
public void setDog(Dog dog) {
this.dog = dog;
} @Override
public void playDog() {
// TODO Auto-generated method stub
//调用方法,实际上是调用接口的方法
      dog.bark();
}
  }

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

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

xml代码:

 <?xml version="1.0" encoding="UTF-8"?>
<beans>
<!-- 一个bean就是一个类的实例 -->
<bean id="girl" class="springAop.Girl_1" scope="prototype"> <property name="dog" ref="labrador" />
<!-- 图_3所示的接口类型的dog属性 --> </bean> <!-- 通过property标签的ref属性,引用一个类的实例labrador -->
<bean id="labrador" class="springAop.Labrador" scope="prototype" /> <bean id="shepherdDog" class="springInject.ShepherdDog" scope="prototype" /> </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类中定义的接口类型属性)

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

Spring IoC原理详解

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

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

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

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

上一篇:【HDOJ】1508 Alphacode


下一篇:报错 500 - Request processing failed; nested exception is com.alibaba.dubbo.rpc.RpcException的解决放案