一、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

05-11 05:13
查看更多