spring小知识点--Bean的初始化方法和销毁方法该如何设置
1. 含义
如果仅仅看属性名称的话,那就是指 AbstractBeanDefinition类中 initMehtodName和destroyMethodName,但我们这里想说的是有哪些初始化以及销毁方式;
2. 设置方式
2.1 @Bean注解设置这2个属性
@Bean注解中存在 initMethod 和 destroyMethod 这2个属性,分别规定 初始化方法 和 销毁方法;
比如:
@Configuration
public class BeanConfigTest{
@Bean(initMethod = "init", destroyMethod = "destroyTest")
public BeanTest getBean() {
return new BeanTest();
}
}
package com.apache
public class BeanTest {
public void init() {}
public void destroyTest() {}
}
@Bean注解是在 ConfigurationClassPostProcessor#processConfigBeanDefinitions() 类中解析的,具体是 ConfigurationClassBeanDefinitionReader#loadBeanDefinitions() 类进行解析;
2.2 @PostContruct注解和@PreDestroy注解
@PostContruct注解定义的是初始化方法;
@PreDestroy注解定义的是销毁方法;
比如:
@Component
public class PostPreTest {
@PostConstruct
public void init() {}
@PreDestroy
public void destroy() {}
}
这2个注解都是 CommonAnnotationBeanPostProcessor#postProcessMergedBeanDefinition() 类进行解析的,当然,主要是利用了InitDestroyAnnotationBeanPostProcessor#postProcessMergedBeanDefinition() 里面的方法(CommonAnnotationBeanPostProcessor 继承 InitDestroyAnnotationBeanPostProcessor);
2.3 实现初始化和销毁接口
接口InitializingBean#afterPropertiesSet() 定义一个初始化方法
接口DisposableBean#destroy() 定义一个销毁方法
@Component
public class InitializingBeanTest implements InitializingBean, DisposableBean {
@Override
public void afterPropertiesSet() {
...
}
@Override
public void destroy() {
...
}
}
在创建bean对象时,AbstractAutowireCapableBeanFactory#invokeInitMethod() 类中会判断类是否是InitializingBean类型,如果是,则调用afterPropertiesSet()方法来实现初始化;
AbstractAutowireCapableBeanFactory#registerDisposableBeanIfNecessary()会注册detroy()方法;
2.4 xml设置这2个方法(了解即可)
<bean id="test" class="com.apache.BeanTest" init-method="init" destroy-method="destroyTest" />
PS
第1种方式 外面的类上需要使用@Configuration注解,这样类中的@Bean注解才能被解析;
第2,3种方式类上需要@Component注解,以便类能够被spring容器扫描到;
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!