请解释控制反转(IOC)的概念,并简要描述 Spring IOC 容器的实现机制。
考察说明
考查对控制反转概念的理解及Spring IOC容器核心实现原理的掌握。
回答思路
- 【回答框架 1】控制反转是一种设计原则,将对象的创建和依赖管理从对象自身转移到外部容器,对象只声明依赖,不负责查找或创建,从而降低耦合。Spring IOC容器负责实例化、配置和组装Bean,管理其完整生命周期,核心是BeanFactory和ApplicationContext两个接口。
- 【回答框架 2】Bean定义通过XML、注解或JavaConfig注册到容器,容器读取配置并创建BeanDefinition对象,保存类名、作用域、属性、构造参数等元数据。然后通过反射机制实例化Bean,默认是单例,根据作用域决定创建次数。
- 【回答框架 3】依赖注入是IOC的实现方式,Spring支持构造器注入、Setter注入和字段注入,容器在创建Bean时解析依赖,通过类型或名称查找并注入。缓存机制使用三级缓存实现单例Bean的循环依赖处理,同时支持懒加载和初始化回调。
- 【回答框架 4】容器的生命周期包括Bean实例化、属性填充、初始化前处理、初始化方法调用、初始化后处理和使用后的销毁。通过BeanPostProcessor和BeanFactoryPostProcessor提供扩展点,实现AOP和属性修改等增强功能。
- 【关键点 1】控制反转是一种设计原则,核心是对象依赖由容器管理。
- 【关键点 2】Spring IOC容器通过BeanDefinition描述Bean,用反射创建实例。
- 【关键点 3】依赖注入是实现IOC的主要方式,支持构造器、Setter和字段注入。
- 【关键点 4】三级缓存用于解决单例Bean的循环依赖。
- 【关键点 5】BeanPostProcessor提供扩展机制,支持AOP等增强。
- 【易错点 1】将控制反转等同于依赖注入,忽略了其更广泛的原则含义。
- 【易错点 2】认为使用Spring IOC能无条件提升性能,实际其反射调用和动态代理有额外开销。
- 【易错点 3】混淆BeanFactory和ApplicationContext的功能范围,后者扩展了国际化、事件等企业级特性。