IOC是什么?
IOC即“控制反转”,控制的什么被反转了?就是:获得依赖对象的方式反转了。
现在有一个场景,我们需要用到一个用户类,同时需要用到与用户类有依赖关系的用户信息类,传统程序设计和使用IOC后的设计有什么区别呢?
下面借两张图来说明这个问题:
图1-1 传统应用程序示意图
在传统程序设计我们肯定需要先创建一个用户类,然后在用户类内部new一个用户信息类,建立它们的依赖关系,两个对象间的耦合度高。
图1-2有IoC/DI容器后程序结构示意图
而在使用IOC容器后,用户类和用户信息类的创建和管理都会交给IOC容器来做,而且在创建用户类时会判断出是否有其他依赖对象需要注入,如何有,则将该依赖对象注入用户类中,这里用户类需要注入的依赖对象就是用户信息类,这样设计能降低对象间的耦合度。
所有的类都会在spring容器中登记,,所有的类的创建、销毁都由 spring来控制,也就是说控制对象生存周期的不再是引用它的对象,而是spring。对于某个具体的对象而言,以前是它控制其他对象,现在是所有对象都被spring控制,所以这叫控制反转。
DI是什么?
spring容器创建实例对象时会根据依赖关系注入依赖对象以及属性,这就是依赖注入。
Spring支持构造函数注入和属性注入。 构造函数注入:在构造函数注入中,我们通过调用类的构造函数,将接口实现类通过构造函数变量传入。 属性注入:属性注入可以有选择地通过Setter方法完成调用类所需依赖的注入。
DI是通过动态代理和反射的方式实现的。
关于反射的概念可以参考:Java反射机制详解