目录
生命周期汇总
细分生命周期
1.实例化
2.属性赋值(依赖注入)
3.Aware接口
4.BeanPostProcessor接口
5.初始化
6.销毁
测试验证
类结构
业务类
测试类
生命周期汇总
Spring Bean 的生命周期见下图
(一定记忆好下图)
细分生命周期
1.实例化
当 Spring 容器加载配置文件时,会根据配置创建 Bean 的实例。这个阶段主要是进行对象实例的创建,使用无参构造方法或工厂方法。
2.属性赋值(依赖注入)
Spring 容器会调用对象的 set 方法或使用注解来为 Bean 的属性进行赋值。这个阶段可以进行各种依赖关系的注入,比如通过构造函数、setter 方法、注解等方式。
3.Aware接口
用来让 Bean 对某些特定信息感知(aware)的接口,它们可以通过实现相应的 Aware 接口来获取容器的相关信息。在 Bean 初始化的过程中,进行一些自定义的操作,例如对 Bean 的名称、工厂、上下文等进行操作或者引用
对应接口有三个:
BeanNameAware:获取自己在 Spring 容器中的名称,即 Bean 的 ID。通过调用 setBeanName() 方法传入 Bean 的名称。
BeanFactoryAware:获取到所属的 BeanFactory,即 Spring 容器本身的引用。通过调用 setBeanFactory() 方法传入 BeanFactory 的引用。
ApplicationContextAware:获取到所属的 Spring 应用上下文的引用。通过调用 setApplicationContext() 方法传入 ApplicationContext 的引用。
4.BeanPostProcessor接口
postProcessBeforeInitialization(Object bean, String beanName):
- 该方法在 Bean 的初始化之前被调用。
- 返回值为 Object,表示修改或替换原始的 Bean 对象。
- 可以用来实现一些预处理操作,例如属性赋值或依赖注入。
- 应用举例:对bean中指定属性加解密,如下代码👇
postProcessAfterInitialization(Object bean, String beanName):
- 该方法在 Bean 的初始化之后被调用。
- 返回值为 Object,表示修改或替换原始的 Bean 对象。
- 可以用来实现一些后处理操作,例如添加额外的功能或修改 Bean 实例,常见应用场景如AOP。
@Component
public class UserService implements BeanPostProcessor {
private String password;
// Getter and Setter for password
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
if (bean instanceof UserService) {
UserService userService = (UserService) bean;
// 在这里对 password 进行解密操作
String decryptedPassword = decrypt(userService.getPassword());
userService.setPassword(decryptedPassword);
}
return bean;
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
return bean;
}
private String decrypt(String encryptedPassword) {
// 实现解密逻辑
// ...
return decryptedPassword;
}
}
5.初始化
在属性赋值完成后,Spring 容器会调用 Bean 的初始化方法(可以通过实现 InitializingBean 接口或自定义初始化方法(自定义的示例如下👇)来指定),进行一些初始化操作,比如连接数据库、加载数据等。
@PostConstruct
public void init() {
System.out.println("自定义初始化方法");
}
6.销毁
当 Spring 容器关闭或移除 Bean 时,会调用 Bean 的销毁方法(可以通过实现 DisposableBean 接口或配置 destroy-method 方法来指定)。在这个阶段可以进行一些资源释放、清理操作,比如关闭数据库连接、释放文件句柄等。
测试验证
git地址:先跟着流程图记忆好生命周期,根据自己理解到的自己手写
SpringBean: SpringBean生命周期
如下是截图参考,根据自己喜好选择clone代码或者截图
类结构
业务类
测试类
public class UserTest {
public static void main(String[] args) {
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);
User user = ctx.getBean(User.class);
System.out.println(user);
}
}
根据控制台打印即可看到Bean的生命周期执行过程
如果想掌握本篇,那就静下心 动起手 搞一遍