内容来自《Java Web 程序员面试笔试宝典》
【出现频率】★★★★★ 【学习难度】★★★★☆
答案:IoC即控制反转(Inversion of Control)。以前在程序中,是由操作类自己通过new方法来创建所要调用的其他类,耦合性很强,现在这些事情都由Spring的IoC容器来做,这时创建对象的控制权发生了反转,不再由调用类自己控制,所以叫控制反转。Spring IoC容器通过依赖注入实现控制反转,采用的原理是反射机制。
IoC的好处是程序员无须关心对象的创建和维护它们之间的依赖关系。只要做好相关配置,Spring IoC容器就会负责管理,程序员只需要关心业务逻辑的实现,它不只是帮我们创建了对象,还负责了对象的整个生命周期:创建、装配、销毁。
通过IoC,能实现面向接口的编程。在调用类(这个类必须是SpringIoC容器维护)只需要声明一个接口变量,IoC容器将注入调用类所需要的实例,业务层或业务系统之间只通过接口来向外暴露功能,降低 了程序内部或系统之间的耦合性。
创建IoC容器,同时需要一种描述来让容器知道需要创建的对象与对象的关系。这个描述最具体表现就是可配置的文件,配置文件通常是XML、Properties等语义化配置文件。当然现在最流行的是结合注解或完全用注解来减少烦琐的XML配置。
同时,我们也来简单了解一下Spring IoC的结构体系。Spring IoC容器的两大核心接口是BeanFactory和ApplicationContext。
Spring IoC容器对Bean的创建采用的是典型的工厂模式,Spring提供了很多的Bean工厂(也就是IoC容器)来为开发者管理对象间的依赖关系和基础服务,图2-2是Bean工厂的关系图。
Spring IoC之所以定义这么多层次的接口,是为了满足不同的使用场合,主要是为了区分Spring内部在操作对象时的传递和转化过程中,对对象的数据访问所做的限制。ListableBeanFactory接口提供容器内Bean的列表或迭代功能,例如,它可以枚举所有的bean实例,而不是客户端通过名称一个一个查询得出所有的实例。也可能通过该接口访问容器中Bean的基本信息,如查看Bean的个数、获取某一类型Bean的配置名、查看容器中是否包括某一Bean等。而HierarchicalBeanFactory表示的是这些Bean是有继承关系的,也就是每个Bean有可能有父Bean。AutowireCapableBeanFactory接口定义Bean的自动装配规则。这四个接口共同定义了Bean的集合、Bean 之间的关系、以及 Bean 行为。DefaultListableBeanFactory继承实现了上述所有Bean工厂的所有功能,它是真正可以作为一个独立使用的IoC容器。