所谓的IOC(inversion of control),就是控制反转的意思。
在传统的程序设计中,应用程序代码通常控制着对象的创建和管理。例如,一个对象需要依赖其他对象,那么它会直接使用 new 关键字新建对象。这样的设计通常被称为 “控制流程”。而 IOC 则是将控制关系发生了反转。控制权被转移到 Spring 容器中,容器负责创建和管理对象,并在需要的时候将它们注入到应用程序中。原来对象的控制权在代码中,在需要时使用 new 关键字创建对象,在Spring中,应用程序不再控制对象的创建,而是被动地接受由容器注入的对象。
在没有 IOC 之前,代码是这样的:
1 | public class A { |
在使用 Spring 的 IOC 之后,代码就变成了这样:
1 |
|
没有Spring的话,需要使用的对象得通过 new 关键字创建,而有了Spring的IOC之后,对象由IOC容器创建并管理,只需要在想要使用的时候从容器中获取就行了(前提是在Spring的生命周期内,否则Spring无法管理)。
IOC 只是一种思想,可以有不同实现方法。Spring 在容器启动的时候,会根据每个 Bean 的配置,将 Bean 注入到 SpringContainer 中,需要时从容器中获取。如果不使用 @Resource
或者 @Autowired
注解自动注入,也可以手动从 ApplicationContext 中获取。
1 | ApplicationContext context = new AnnotationConfigApplicationContext("org.example"); |
Spring IOC 管理的 Bean 默认是单例的,如果需要每次请求时都创建一个新的实例,则需要额外配置。
1 |
|
使用IOC的优点
单例使用的情况下不用多次创建相同的Bean,使用方不关心引用Bean的细节实现,且修改Bean之后使用方无感。下面举例:
1 | A a = new A(c, d, e...); |
如果要使用该对象,还要把 c、d、e 等多个类实现传入。如果构造方法修改之后还需要同步修改 new 传入的对象。如果需要单例使用该对象(如线程池、接口实现、Dao Mapper)在并发时需要多次 new 相同的实例。