当前位置: 首页 > news >正文

如果想在 bean 创建出来之前和销毁之前做一些自定义操作可以怎么来实现呢?

使用生命周期扩展接口(最灵活)​

创建前拦截可以通过实现 InstantiationAwareBeanPostProcessor 接口的 postProcessBeforeInstantiation 方法,在Bean实例化前执行逻辑
在销毁前拦截可以通过实现 DestructionAwareBean 接口的 postProcessBeforeDestruction 方法,在Bean销毁前执行逻辑

@Component
public class MyInstantiationInterceptor implements InstantiationAwareBeanPostProcessor {
    @Override
    public Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) {
        if (beanClass == TargetBean.class) {
            System.out.println("【拦截】Bean实例化前操作:" + beanName);
        }
        return null; // 返回null表示继续默认实例化流程
    }
}

@Component
public class MyDestructionInterceptor implements DestructionAwareBeanPostProcessor {
    @Override
    public void postProcessBeforeDestruction(Object bean, String beanName) {
        if (bean instanceof MyResourceBean) {
            System.out.println("【拦截】Bean销毁前释放资源:" + beanName);
            ((MyResourceBean) bean).release();
        }
    }
}

使用标准注解

通过 @PostConstruct 注解标记方法,在 Bean 属性注入完成后执行逻辑,通过 @PreDestroy 注解标记方法,在容器关闭时触发

@Component
public class MyBean {
    @PostConstruct
    public void init() {
        System.out.println("Bean初始化完成,执行自定义逻辑");
    }
    @PreDestroy
    public void cleanup() {
        System.out.println("Bean销毁前关闭数据库连接");
    }
}

我推荐使用这个,解耦还简洁

通过 XML 文件配置元数据

指定init-method和destroy-method:

<bean id="myBean" class="com.example.MyBean" 
      init-method="customInit" 
      destroy-method="customDestroy"/>

然后对使用 @Bean 注解的属性指定方法

@Configuration
public class App {
	@Bean(initMethod = "customInit", destroyMethod = "customDestroy")
    public MyBean myBean() {
        return new MyBean();
    }
}

使用 Spring 原生接口

初始化拦截
实现 InitializingBean 接口的 afterPropertiesSet 方法:

@Component
public class MyBean implements InitializingBean {
    @Override
    public void afterPropertiesSet() {
        System.out.println("Spring接口实现的初始化逻辑");
    }
}

销毁拦截实现 DisposableBean 接口的 destroy 方法:

@Component
public class MyBean implements DisposableBean {
    @Override
    public void destroy() {
        System.out.println("Spring接口实现的销毁逻辑");
    }
}

小总结,使用第二种方法可以实现解耦,并且代码简洁,使用第三种方法可以实现对原有项目的兼容,具体使用哪种方法大家可以根据实际需求去选择

相关文章:

  • 6.2 GitHub API接口设计实战:突破限流+智能缓存实现10K+仓库同步
  • Nature重磅:后晶体管时代光子芯片革新AI计算!光子处理器运行《吃豆人》性能比肩电子,能效提升超500倍
  • 如何查看自己抖音的IP属地?详细教程+常见问题解答
  • 达梦数据库用函数实现身份证合法校验
  • Ubuntu18系统安装
  • Android.bp中添加条件判断编译方式
  • LeetCode 题目 「二叉树的右视图」 中,如何从「中间存储」到「一步到位」实现代码的优化?
  • Ubuntu-搭建nifi服务
  • PHM学习软件|PHM预测性维护系统
  • JVM初探——走进类加载机制|三大特性 | 打破双亲委派SPI机制详解
  • Cesium.js(5):坐标转换
  • 如何使用Python调试学习两数之和算法
  • 物联网|无人自助台球厅源码|哪些框架支持多设备连接?
  • 成为一种国家战略范畴的新基建的智慧园区开源了
  • Interaction Toolkit 跳跃功能详解
  • 【C++初学】课后作业汇总复习(二)函数重载与类的成员函数重载,默认参数值函数——认识多态 - Toggle
  • AIDD-人工智能药物设计-大语言模型在医学领域的革命性应用
  • 03-框架篇 面试题-mk
  • k8s通过service标签实现蓝绿发布
  • LabVIEW中VI Scripting 特定对象解析
  • 做网站编程时容易遇到的问题/seo搜索引擎推广什么意思
  • 佛山网站建设哪家效果好/百度指数有哪些功能
  • 石家庄个人建网站/鼓楼网站seo搜索引擎优化
  • 泰安钢管网站建设/凡客建站
  • 阿里巴巴国际站靠谱吗/百度快速查询
  • 什么是网络营销?有何特点/百度seo优化公司