初步了解IOC和DI
IOC和DI分别是什么?
IOC: 控制反转(Inverse of Control),是一种设计思想,依赖对象不会通过new的方式创建被依赖对象,而将被依赖对象交给第三方对象来进行管理,依赖对象通过第三方对象来获取被依赖对象。在spring中就是将对象创建的控制权交给spring容器进行管理。
DI: 依赖注入(dependency injection),spring容器在创建对象时,将配置文件中的属性注入到该对象中。
控制反转和依赖注入的关系?
依赖注入是控制反转实现的主流方式,还有一种实现方式为依赖查找。
控制反转(IOC)
上面我们说了什么是控制反转,这里我们用代码的方式来解释这个概念。
传统方式如下:
public interface BookService {
}
public class BookServiceImp implements BookService {
}
public class BookController {
private BookService bookService;
public BookController() {
}
public void initMethod(){
bookService = new BookServiceImp();
}
}
上面程序可以看出,BookController依赖于BookService,BookController通过new的方式创建该属性。不难看出此时依赖类和被依赖类有着很高的耦合关系,当我们想要更换BookService的实现方式时,就必须要更改BookController类中的代码的。当有大量这样的代码存在程序当中时,是难以维护和调试的。
于是我们可以将对象的创建放到第三方的类中来实现,如下:
public class GetBookService {
public void getBookService(Object condition){
if(condition == cond1){
return new BookServiceImp1();
}else if(condition == cond2){
return new BookServiceImp2();
}else{
return new BookServiceImp3();
}
}
}
当依赖类想要获取被依赖的类时,我们就可以直接通过GetBookService来获取。这样就解决了依赖类和被依赖类之间高耦合的问题。但是此时GetBookService与被依赖类又出现了很高的耦合性。
于是我们可以将高耦合的代码(BookService的属性)放到配置文件中,第三方的类通过反射机制将属性配置注入
到被依赖对象中。
在spring框架中,IOC容器(spring容器)就相当于第三方类,由IoC容器来管理对象的生命周期、依赖关系等,从而使得应用程序的配置和依赖性规范与实际的应用程序代码分离。其中一个特点就是通过文本的配置文件进行应用程序组件间相互关系的配置,而不用重新修改并编译具体的代码。
依赖注入
上面提到注入,其实这就是依赖注入。IoC容器通过依赖注入的方式来实现对被依赖对象的创建。所以我们说控制反转是一种设计思想,而依赖注入是它的一种具体实现方式。在spring中通过配置属性的方式不同,可以分为setter注入和constructor注入。
总结
控制反转:
- 谁控制谁?
spring容器控制对象的创建和初始化以及生命周期。
- 如何反转?
原先依赖对象控制被依赖对象的创建,现在由spring容器控制被依赖对象的创建。
依赖注入:
- 谁依赖谁?
spring容器管理的对象依赖xml配置文件中的属性。
- 谁注入谁?
xml配置的属性注入spring容器管理的对象当中。