Spring Bean的生命周期
生命周期演示代码
@Component
public class MyBean implements BeanNameAware, InitializingBean, DisposableBean {
@Value("${name}")
private String name;
@Value("#{20-2}")
private Integer age;
@Value("男")
private String sex;
public MyBean() {
System.out.println("第一步:调用类的无参构造函数:"+name);
}
@PostConstruct
public void init() {
System.out.println("第四步:属性被设置之后,可以获取到属性:"+name+age+sex);
}
@PreDestroy
public void destory() {
// 在销毁 Bean 之前执行的清理工作
System.out.println("第八步:Performing pre-destroy cleanup for MyBean");
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
@Override
public String toString() {
return "MyBean{" +
"name='" + name + '\'' +
", age=" + age +
", sex='" + sex + '\'' +
'}';
}
@Override
public void setBeanName(String s) {
System.out.println("第二步:获取到bean的名称为:" + s);
}
@Override
public void destroy() throws Exception {
System.out.println("第九步:实现DisposableBean接口才会调用此方法destroy,可以获取属性:"+name+age+sex);
}
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("第五步:通过此方法可以获取到已经注入的属性值:"+name+age+sex);
}
}
1、实例化
实例化就是调用类的
无参
构造方法
public MyBean() {
System.out.println("第一步:调用类的无参构造函数");
}
2、调用BeanNameAware的方法
BeanNameAware
是一个接口类,如果Bean
实现了这个接口,则要重写setBeanName
方法,第二步就会调用该方法,可以通过该方法获取到这个Bean
的容器名称
@Override
public void setBeanName(String s) {
System.out.println("第二步:获取到bean的名称为:" + s);
}
3、执行BeanPostProcessor的postProcessBeforeInitialization方法
BeanPostProcessor
是 Spring 框架提供的一个扩展点接口,它允许开发者在 Bean 实例化、依赖注入、初始化等过程中插入自定义的处理逻辑。BeanPostProcessor
接口定义了两个方法:postProcessBeforeInitialization()
和postProcessAfterInitialization()
,这两个方法分别在 Bean 初始化前后被调用。
postProcessBeforeInitialization()
方法在 Bean 的初始化方法(如 @PostConstruct 注解标记的方法或实现 InitializingBean 接口的 afterPropertiesSet() 方法)调用之前被调用。在这个方法中,开发者可以对 Bean 进行一些预处理操作。
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
public class LoggingBeanPostProcessor implements BeanPostProcessor {
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
// 在 Bean 初始化之前添加日志记录逻辑
System.out.println("Initializing bean: " + beanName);
return bean;
}
}
4、执行添加@PostConstruct注解的方法
在 Bean 的所有属性都被设置之后,并且在将 Bean 提供给应用程序之前,执行自定义初始化逻辑
@PostConstruct
public void init() {
System.out.println("属性被设置之后,可以获取到属性:"+name+age+sex);
}
5、调用InitializingBean接口的afterPropertiesSet方法
InitializingBean
接口的主要作用是允许 Bean 在容器设置了所有配置属性之后执行自定义的初始化操作。afterPropertiesSet()
方法通常用于执行那些需要在 Bean 的所有属性被设置之后才能进行的初始化操作
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("通过此方法可以获取到已经注入的属性值:"+name+age+sex);
}
6、执行BeanPostProcessor的postProcessAfterInitialization方法
postProcessAfterInitialization()
方法在 Bean 的初始化方法调用之后被调用。在这个方法中,开发者可以对 Bean 进行一些后处理操作。
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
public class LoggingBeanPostProcessor implements BeanPostProcessor {
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
// 在 Bean 初始化之后添加日志记录逻辑
return bean;
}
}
7、使用Bean
使用Bean
@SpringBootTest
class TestApplication {
@Autowired
MyBean myBean;
@Test
void contextLoads() {
System.out.println("第七步:使用bean"+myBean);
}
}
8、执行添加@PreDestroy注解的方法
用于在销毁 Bean 之前执行的方法
@PreDestroy
public void preDestroyMethod() {
// 在销毁 Bean 之前执行的清理工作
System.out.println("Performing pre-destroy cleanup for MyBean");
}
9、调用DisposableBean接口的destroy方法
DisposableBean
是 Spring 框架中的一个接口,用于在 Bean 销毁时执行清理操作。
@Override
public void destroy() throws Exception {
// 在销毁 Bean 时执行的清理工作
System.out.println("Performing cleanup for MyBean");
}