了解 Spring 生命周期对于我们更好地运用它非常重要。本篇文章力图用易懂、有趣的方式带你深入剖析 Spring 生命周期,让你成为 Spring 开发的专家。
目录
要了解 Spring生命周期,我们需要分别了解 Spring 程序启动过程以及 Spring Bean的生命周期。下面开始详细介绍。
Spring 程序启动主要分为这几个步骤:
Spring Bean 生命周期可分为以下阶段:
BeanFactory 是 Spring 中最核心的接口,主要提供了以下功能:
ApplicationContext 是 BeanFactory 的实现类,扩充了一些功能,如:
BeanDefinition 是 Bean 配置的原材料,包括了Bean 实例的各种属性和依赖关系等信息。BeanFactory 根据 BeanDefinition 来创建、注入和实例化 Bean。
Bean 实例化分为以下几个步骤:
依赖注入可以分为以下几个步骤:
在 Bean 实例化后,Spring 提供了回调方法的支持来执行一些特定的操作。
afterPropertiesSet
方法或定义 @PostConstruct
注解的方法来执行初始化操作destroy
方法或定义 @PreDestroy
注解的方法来执行销毁操作BeanPostProcessor 接口允许在 Bean 初始化的过程中执行自定义操作。它提供了两个方法:
afterPropertiesSet
方法之前@PostConstruct
注解的方法之后实现此接口,你可以在 Bean 的生命周期中,通过实现类插入定制的动作。
InstantiationAwareBean_postProcessor 接口继承自 BeanPostProcessor,提供在 Bean 实例化之前进行扩展操作的能力。
SmartInstantiationAwareBeanPostProcessor 继承自 InstantiationAwareBeanPostProcessor,提供对简单类型字段的候选者的选择。
假设我们有一个简单的 Spring 应用,目标是了解 Bean 生命周期的各个阶段。
以下是一个简单的 Spring 配置和示例 Bean:
@Configuration
public class AppConfig {
@Bean
public UserService userService() {
return new UserService```java
new UserService();
}
}
@Component
public class UserService {
@Autowired
private OrderService orderService;
public UserService() {
System.out.println("UserService: 构造方法");
}
@PostConstruct
public void init() {
System.out.println("UserService: 初始化");
}
@PreDestroy
public void destroy() {
System.out.println("UserService: 销毁");
}
}
@Component
public class OrderService {
public OrderService() {
System.out.println("OrderService: 构造方法");
}
}
上面的代码定义了一个简单的 Spring 配置类 AppConfig
,其中包含一个 userService
Bean。UserService 有一个对 OrderService 的依赖。这两个 Bean 包含了一些生命周期相关的方法(构造方法、初始化和销毁)。
现在我们来分析整个 Bean 生命周期,看看在不同阶段输出的内容。启动 Spring 应用,将看到如下输出:
OrderService: 构造方法
UserService: 构造方法
UserService: 初始化
首先,OrderService 的构造方法被调用,接着是 UserService 的构造方法。最后,UserService 的初始化方法被调用。接下来,我们以 UserService 为例,看看在生命周期的各个阶段都发生了什么:
从上述分析中,我们可以看到 Bean 生命周期的多个阶段,并了解 Spring 如何实例化、装配和管理 Bean。为了更深入了解 Bean 生命周期,我们可以通过在 UserService 中实现 InitializingBean 和 DisposableBean 接口,并重写接口方法来观察输出结果。
@Component
public class UserService implements InitializingBean, DisposableBean {
// ...其他代码
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("UserService: afterPropertiesSet");
}
@Override
public void destroy() throws Exception {
System.out.println("UserService: DisposableBean 销毁方法");
}
}
再次运行应用,我们将看到如下输出:
OrderService: 构造方法
UserService: 构造方法
UserService: 初始化
UserService: afterPropertiesSet
这次,除了 @PostConstruct
注解的方法,UserService 初始化阶段还包括调用 afterPropertiesSet
方法。
在本文中,我们首先介绍了 Spring Bean 的生命周期,并学习了 Bean 生命周期中的各个阶段。