IOC (Inversion of Control) 控制反转,是一种设计思想,是面向对象编程中的一种设计原则,用来降低程序的耦合度。
IoC指将对象的控制权交给”第三方“,由第三方来负责管理对象的生命周期和对象间的依赖关系。
【IoC的起源】
早在2004年,Martin Fowler就提出了“哪些方面的控制被反转了?”这个问题。他总结出是依赖对象的获得被反转了,因为大多数应用程序都是由两个或是更多的类通过彼此的合作来实现企业逻辑,这使得每个对象都需要获取与其合作的对象(也就是它所依赖的对象)的引用。如果这个获取过程要靠自身实现,那么这将导致代码高度耦合并且难以维护和调试。
IoC的实现方式有依赖注入和依赖查找。
- DI (Dependency Injection) 依赖注入,容器负责组件的装配,把符合依赖关系的对象通过JavaBean属性(set注入)或者构造函数(构造器注入)传递给需要的对象。
依赖注入常见的注入方式有两种:set注入和构造器注入
依赖注入可以通过配置指定组件,也可以自动的选择要装配的组件
Spring的bean标签内可以嵌套property或constructor-arg来注入属性
- DL(Dependency Lookup) 依赖查找:组件使用容器提供的API来查找依赖的对象
Spring提供 getBean() 方法来查找Bean
Spring底层使用反射+工厂模式实现IoC,提供了两种实现方式:
-
BeanFactory
IoC容器的基本实现,是Spring内部使用的接口,不提供给开发人员使用。
-
ApplicationContext
BeanFactory的子接口,提供了更多、更强大的功能,一般由开发人员使用。
ApplicationContext的主要实现类:
-
FileSystemXmlApplicationContext
-
ClassPathXmlApplicationContext
-
AnnotationConfigApplicationContext
-
【面试题】说一下对Spring IOC的理解
IoC的概念
IoC的实现
【思考】
IoC与IoC容器
IoC是一种设计思想,IoC的具体实现就是IoC容器,IoC容器存储由Spring创建/管理的Bean,以Spring为例,IoC容器就是 singletonObjects:Map<String,Object>
依赖注入与自动装配
依赖注入是IoC是一种实现方式,由容器负责组件的装配,这种装配是可以通过配置来控制的,如bean标签中嵌套property或constructor。而自动装配,不需要这种配置,强调是自动化的装配。