Loading

初探Spring - IOC原理

一、IOC是什么

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

举个例子:

如果我们想开车,一般人会努力工作,拼命挣钱,然后买车。还有另外一种选择,去租车行租车。对于前者,他只能开自己的车,而且需要自己负责车的保养、维修。而后者则可以随时换车,今天开大奔感觉不爽,明天换辆奥迪,而且无需对车进行保养和维修,自由度很大。

对应在程序设计中,第一种方式类似于:在Person类内部创建一个Car类的实例BMW,在类内部就将Car写死了,而且还要负责对BMW的创建、维护、回收。

而第二种方法则类似于:在Person中只创建一个Car的引用,而不将其实例化,待到程序运行中需要使用到Car时,动态的注入实例,可以传入BMW,Audi,Benz...不仅自由度高,耦合度低,且无需对实例进行管理维护。

第二种方案的实现代码:

1.主类

public class PersonDrive {
    public static void main(String[] args) {
        ApplicationContext context = new FileSystemXmlApplicationContext("applicationContext.xml");
        Car car = (Car) context.getBean("Benz");
        Person person = new Person();
        person.setCarName(car.getName());
        person.drive();

        // 奔驰开烦了,换辆奥迪
        car = (Car) context.getBean("Audi");
        person.setCarName(car.getName());
        person.drive();
    }
}

2.定义Car接口

public interface Car {
    public String getName();
}

 

3.Benz实现Car接口

public class Benz implements Car {
    public String name;
    public String getName(){
        return this.name;
    }
    public void setName(String name){
        this.name=name;
    }
}

 

4.Audi实现Car接口

public class Audi implements Car {
    private String name;


    public String getName() {
        return this.name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

 

5.Person类

public class Person {
    private String carName;
    public void drive(){
        System.out.println("drive:"+carName);
    }
    public void setCarName(String name){
        this.carName=name;
    }
}

 

6.配置applicationContext.xml文件

<bean id="Audi" name="Audi" class="com.crazyacking.IOCTest.Audi">
        <property name="name" value="Audi"></property>
    </bean>
    <bean id="Benz" name="Benz" class="com.crazyacking.IOCTest.Benz">
        <property name="name" value="Benz"></property>
    </bean>

 

运行输出:

drive:Benz
drive:Audi

 

posted @ 2016-06-08 09:51  北岛知寒  阅读(213)  评论(0编辑  收藏  举报