IOC容器
IOC容器(Inversion of Control Container)是Spring框架的核心部分,它体现了控制反转(Inversion of Control, IoC)的设计原则。在传统的软件开发中,组件直接控制其依赖对象的创建和管理;而在IoC模式下,这种控制权被反转给了一个专门的第三方——即IOC容器,组件不再自己管理依赖,而是由容器负责创建和管理这些依赖关系并注入到组件中。
IOC容器的主要职责包括:
-
实例化Bean(组件):
- 根据配置信息(XML、注解或者Java配置类),Spring容器负责创建应用程序所需的各类Bean对象。
-
配置Bean:
- 设置Bean的属性值,这可以通过依赖注入(DI)完成,包括基本类型属性、引用其他Bean类型的属性等。
-
依赖管理:
- 解析Bean之间的依赖关系,并按照依赖关系自动装配Bean,即将一个Bean所依赖的其他Bean注入到它自身。
-
生命周期管理:
- 管理Bean的完整生命周期,包括创建(实例化)、初始化(调用初始化方法或实现InitializingBean接口的方法)、使用以及销毁(调用销毁方法或实现DisposableBean接口的方法)。
-
容器扩展性:
- 提供了一系列的扩展点,允许开发者自定义Bean的创建、初始化、销毁等行为,比如通过BeanPostProcessor接口可以定制预初始化和后初始化的操作。
-
容器事件监听:
- 支持容器级别的事件监听,当Bean的生命周期状态发生变化时,可以触发相应的事件处理器。
在Spring中,常见的IOC容器实现主要有两种:
-
BeanFactory: 这是Spring IoC容器的基本实现,提供了基本的IoC服务支持,是Spring内部使用的最原始接口,一般不推荐直接使用。 -
ApplicationContext: 这是BeanFactory的子接口,也是更常用的IOC容器实现。它提供了更多的高级特性,比如国际化支持、AOP代理、消息资源处理、事件发布/监听、便捷的载入多个配置文件的能力等。在实际开发中,几乎都是使用ApplicationContext作为IoC容器,而不是底层的BeanFactory。
通过使用Spring的IOC容器,开发者可以将注意力集中在业务逻辑的开发上,而不需要过多关注对象的创建和依赖关系管理等琐碎细节,从而提高了开发效率和应用结构的健壮性。
Spring Bean的生命周期
Spring Bean的生命周期涉及从创建到销毁的一系列有序步骤,以下是Spring框架中Bean的生命周期概述:
-
实例化(Instantiation)
- Spring IoC容器根据配置信息(XML、注解或Java配置类)创建Bean实例。
-
填充属性(Populating Properties)
- Spring容器利用依赖注入(Dependency Injection, DI)将属性值注入到Bean的属性中,包括通过构造函数注入或setter方法注入。
-
初始化前的处理(Post-Processors Before Initialization)
- 如果Bean实现了
org.springframework.beans.factory.config.BeanPostProcessor接口,那么postProcessBeforeInitialization方法会被调用。
- 如果Bean实现了
-
初始化(Initialization)
- 如果Bean实现了
org.springframework.beans.factory.InitializingBean接口,那么afterPropertiesSet方法会被调用。 - 另外,也可以通过在Bean的类上使用
@PostConstruct注解标记一个方法,该方法会在所有必需的属性设置完成后立即调用。
- 如果Bean实现了
-
初始化后的处理(Post-Processors After Initialization)
- 同样,如果存在BeanPostProcessor,那么
postProcessAfterInitialization方法会被调用,这是在Bean初始化完成之后执行的。
- 同样,如果存在BeanPostProcessor,那么
-
使用(Usage)
- 初始化完成后,Bean就可以在Spring容器中被应用程序正常地使用了。
-
销毁前的通知(Pre-Destruction Notification)
- 当容器关闭或销毁Bean之前,如果Bean实现了
org.springframework.beans.factory.DisposableBean接口,那么destroy方法会被调用。 - 同样的,也可以通过在Bean的类上使用
@PreDestroy注解标记一个方法,该方法会在Bean销毁前调用。
- 当容器关闭或销毁Bean之前,如果Bean实现了
-
销毁(Destruction)
- 容器释放Bean,此时资源清理和其他终止逻辑得以执行。
总结来说,Spring Bean在其生命周期内经历了实例化、配置、初始化、使用以及最终的销毁等一系列过程,期间Spring容器提供了多种扩展点供开发者介入以实现自定义行为。在整个生命周期中,Spring IoC容器全程管理着Bean的状态和行为。