首页 > 其他分享 >spring小知识点--Bean的初始化方法和销毁方法该如何设置

spring小知识点--Bean的初始化方法和销毁方法该如何设置

时间:2023-03-16 22:36:02浏览次数:41  
标签:知识点 初始化 -- spring void Bean 注解 方法 public

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

标签:知识点,初始化,--,spring,void,Bean,注解,方法,public
From: https://www.cnblogs.com/scott1440298847/p/17224462.html

相关文章

  • sed
    seddescriptions对文件进行增、删、改、查替换语法:sed选项's/搜索的内容/替换的内容/动作'需要处理的文件其中,s表示search搜索;斜杠/表示分隔符,可以自己定义......
  • PCB铺铜-11
         铺地平面铜:更新铜皮:挖铜:  设置禁止区域;转换铜皮:合并铜皮:  ......
  • 人工智能python3+tensorflow人脸识别_使用 face-api.js 在你的浏览器中做人脸识别(基于
    我很兴奋地告诉你,终于可以在浏览器中运行人脸识别了!这篇文章我将介绍face-api.js,这个类库构建于tensorflow.js之上。它实现了多个CNNs(卷积神经网络)以解决人脸检测、......
  • 生成钻孔表-生成geriber-14
    生成钻孔表:制板给板厂辅助参考作用选择组移动表格    生成geriber:生成钻孔:规则钻孔-    不规则钻孔-不是圆形或者方形    ......
  • 检测PCB连通性-删除单端走线与过孔-删除死铜-尺寸标注-13
    检测PCB连通性:板子界面放大,跳转到DRC错误界面  删除单端走线与过孔:      删除死铜:查看死铜数-删除死铜-  尺寸标注:  显示对应层-设......
  • 添加mark-整板添加地孔-调整丝印-添加文本-12
    选择好库:mark点需要在库中,封装需要相关焊盘的psm文件,文本文件,bra文件等等    整板添加地孔:增加层之间连接性,性能更好设置好栅格,执行复制命令调整位号丝印:......
  • Ubuntu20.04搭建k8s集群
    前言服务器统一版本Ubuntu20.04搭建集群最少要两台服务器每台服务器都需要docker、环境配置、安装kubeadm、kubelet和kubectldocker安装dockersudoa......
  • 万字长文详解声明式配置发展历程
    零、前言​文本仅用于澄清声明式配置技术概述,KCL概念以及核心设计,以及与其他配置语言的对比。一、声明式配置概述​1.1配置的重要性​软件不是一成不变的,每天有成......
  • 远古ARC-D题选做
    [ARC048D]たこ焼き屋とQ人の高橋君题目大意:给你一棵有\(n\)(\(1\len\le10^5\))个节点的树,其中一些节点是特殊节点,相邻两个点的距离为\(1\)。有\(q\)(\(1\le......
  • [CSS3] Hide some DOM element while print
    <style>@mediaprint{.no-print{display:none!important;}}</style><divclass="overlay--containerno-print">...</div>......