在Spring框架中,Bean的生命周期是指一个Bean从创建到销毁的全过程。了解Bean的生命周期有助于更好地管理和优化Spring应用。以下是Spring Bean生命周期的一般步骤:
-
实例化:Spring容器根据配置文件或注解创建一个Bean的实例。
-
属性赋值:Spring容器将配置文件或注解中定义的属性值注入到Bean中。这个过程可以通过构造函数注入、Setter注入或字段注入完成。
-
BeanNameAware:如果Bean实现了
BeanNameAware接口,Spring容器会调用setBeanName方法,将Bean的ID传递给它。 -
BeanFactoryAware:如果Bean实现了
BeanFactoryAware接口,Spring容器会调用setBeanFactory方法,将BeanFactory传递给它。 -
ApplicationContextAware:如果Bean实现了
ApplicationContextAware接口,Spring容器会调用setApplicationContext方法,将ApplicationContext传递给它。 -
BeanPostProcessor:在Bean初始化前,Spring容器会调用
BeanPostProcessor接口的postProcessBeforeInitialization方法。这允许开发者在Bean初始化之前对其进行修改或处理。 -
初始化:如果Bean实现了
InitializingBean接口,Spring容器会调用其afterPropertiesSet方法。如果配置了自定义的初始化方法,Spring容器也会调用它们(通过init-method属性配置)。 -
BeanPostProcessor:在Bean初始化后,Spring容器会再次调用
BeanPostProcessor接口的postProcessAfterInitialization方法。这同样允许开发者在Bean初始化之后进行处理。 -
就绪:Bean现在已经完全初始化,可以被应用程序使用。
-
销毁:当Spring容器关闭时,Spring会处理Bean的销毁。如果Bean实现了
DisposableBean接口,Spring容器会调用其destroy方法。如果配置了自定义的销毁方法,Spring容器也会调用它们(通过destroy-method属性配置)。
代码如下:
package com.blog.test;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.*;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
/**
* bean的生命周期
*/
@Component
public class TestBeanLife implements BeanFactoryAware,BeanNameAware, BeanPostProcessor,ApplicationContextAware, InitializingBean, DisposableBean {
private String beanName;
private ApplicationContext applicationContext;
public TestBeanLife() {
System.out.println("1. Bean实例化");
}
@Override
public void setBeanName(String name) {
this.beanName = name;
System.out.println("2. BeanNameAware:设置Bean的名称:" + name);
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext = applicationContext;
System.out.println("4. ApplicationContextAware:设置ApplicationContext");
}
@Override
public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
System.out.println("3. BeanFactoryAware setBeanFactory");
}
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("7. InitializingBean:属性赋值后初始化");
}
// @Override
// public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
// System.out.println("4. BeanPostProcessor:postProcessBeforeInitialization,Bean名称:" + beanName);
// return bean; // 可以修改bean或者返回原bean
// }
//
// @Override
// public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
// System.out.println("8. BeanPostProcessor:postProcessAfterInitialization,Bean名称:" + beanName);
// return bean; // 可以修改bean或者返回原bean
// }
//自定义初始化方法
@PostConstruct
public void customInit() {
System.out.println("6. 自定义初始化方法");
}
//自定义销毁方法
@PreDestroy
public void customDestroy() {
System.out.println("10. 自定义销毁方法");
}
@Override
public void destroy() throws Exception {
System.out.println("11. DisposableBean:销毁");
}
}
启动应用:
1. Bean实例化
2. BeanNameAware:设置Bean的名称:testBeanLife
3. BeanFactoryAware setBeanFactory
4. ApplicationContextAware:设置ApplicationContext
6. 自定义初始化方法
7. InitializingBean:属性赋值后初始化
关闭应用:
10. 自定义销毁方法
11. DisposableBean:销毁