Spring Bean 的生命周期是一个复杂但有序的过程,从 Bean 的定义到销毁,每个阶段都有其特定的作用。下面为你详细介绍 Spring Bean 的完整生命周期流程:
1. Bean 定义阶段
- 作用:在 Spring 配置文件(如 XML 配置文件)或使用注解(如
@Component
、@Service
等)定义 Bean 的元信息,包括 Bean 的类名、作用域、依赖关系等。 - 示例:
-
<bean id="userService" class="com.example.service.UserService"/>
或者使用注解:
@Service
public class UserService {
// 类的具体实现
}
2. Bean 实例化阶段
- 作用:Spring 容器根据 Bean 的定义信息,使用反射机制创建 Bean 的实例。
- 示例:Spring 容器会调用
UserService
类的构造函数来创建实例。
3. 属性注入阶段
- 作用:如果 Bean 有依赖的其他 Bean 或属性,Spring 容器会将这些依赖注入到 Bean 中。可以通过构造函数注入、Setter 方法注入或字段注入。
- 示例:
-
@Service public class UserService { @Autowired private UserRepository userRepository; // 类的具体实现 }
4. BeanNameAware 接口回调阶段
- 作用:如果 Bean 实现了
BeanNameAware
接口,Spring 容器会调用setBeanName
方法,将 Bean 的名称传递给 Bean。 - 示例:
-
import org.springframework.beans.factory.BeanNameAware; public class MyBean implements BeanNameAware { private String beanName; @Override public void setBeanName(String name) { this.beanName = name; } }
5. BeanFactoryAware 接口回调阶段
- 作用:如果 Bean 实现了
BeanFactoryAware
接口,Spring 容器会调用setBeanFactory
方法,将当前的BeanFactory
传递给 Bean。 - 示例:
-
import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.BeanFactoryAware; public class MyBean implements BeanFactoryAware { private BeanFactory beanFactory; @Override public void setBeanFactory(BeanFactory beanFactory) { this.beanFactory = beanFactory; } }
6. BeanPostProcessor 前置处理阶段
- 作用:
BeanPostProcessor
是 Spring 提供的一个扩展接口,在 Bean 初始化前后进行额外的处理。在 Bean 初始化之前,Spring 容器会调用BeanPostProcessor
的postProcessBeforeInitialization
方法。 - 示例:
-
import org.springframework.beans.BeansException; import org.springframework.beans.factory.config.BeanPostProcessor; public class MyBeanPostProcessor implements BeanPostProcessor { @Override public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { // 在 Bean 初始化之前进行额外处理 return bean; } }
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
public class MyBeanPostProcessor implements BeanPostProcessor {
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
// 在 Bean 初始化之前进行额外处理
return bean;
}
}
7. InitializingBean 接口回调阶段
- 作用:如果 Bean 实现了
InitializingBean
接口,Spring 容器会调用afterPropertiesSet
方法,用于在属性注入完成后进行一些初始化操作。 - 示例:
-
import org.springframework.beans.factory.InitializingBean; public class MyBean implements InitializingBean { @Override public void afterPropertiesSet() { // 初始化操作 } }
8. 自定义初始化方法调用阶段
- 作用:可以通过
@PostConstruct
注解或在 XML 配置中指定init-method
属性来定义自定义的初始化方法。 - 示例:
-
import javax.annotation.PostConstruct; public class MyBean { @PostConstruct public void init() { // 自定义初始化操作 } }
9. BeanPostProcessor 后置处理阶段
- 作用:在 Bean 初始化之后,Spring 容器会调用
BeanPostProcessor
的postProcessAfterInitialization
方法。 - 示例:
-
import org.springframework.beans.factory.config.BeanPostProcessor; public class MyBeanPostProcessor implements BeanPostProcessor { @Override public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { // 在 Bean 初始化之后进行额外处理 return bean; } }
10. Bean 就绪阶段
- 作用:经过上述步骤,Bean 已经完成了初始化,可以被应用程序使用。
11. DisposableBean 接口回调阶段
- 作用:如果 Bean 实现了
DisposableBean
接口,在 Spring 容器关闭时,会调用destroy
方法。 - 示例:
-
import org.springframework.beans.factory.DisposableBean; public class MyBean implements DisposableBean { @Override public void destroy() { // 销毁操作 } }
12. 自定义销毁方法调用阶段
- 作用:可以通过
@PreDestroy
注解或在 XML 配置中指定destroy-method
属性来定义自定义的销毁方法。 - 示例:
-
import javax.annotation.PreDestroy; public class MyBean { @PreDestroy public void destroy() { // 自定义销毁操作 } }
总结
Spring Bean 的生命周期包括定义、实例化、属性注入、各种接口回调、初始化方法调用、就绪使用和销毁等阶段。通过实现不同的接口和使用注解,可以在各个阶段进行自定义的处理。