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