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容器扫描到;

posted @   flashOS  阅读(46)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示