千家信息网

Bean自定义初始化和销毁方法是什么

发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,今天小编给大家分享一下Bean自定义初始化和销毁方法是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我
千家信息网最后更新 2026年11月02日Bean自定义初始化和销毁方法是什么

今天小编给大家分享一下Bean自定义初始化和销毁方法是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。

Bean三种自定义初始化和销毁

一. 三种方法概述

在配置类中指定 @Bean(initMethod = "init",destroyMethod = "destory")注解

实现InitializingBean接口并重写其afterPropertiesSet方法,实现DisposableBean接口并重写destroy方法

利用java的JSR250规范中的@PostConstruct标注在init方法上,@PreDestroy标注在destroy方法上

二. 方法详述

1. 方法1:配置类中指定

示例代码

public class CarA {    public CarA() {        System.out.println("CarA。。。构造函数");    }    public void initCarA(){        System.out.println("CarA的init()方法");    }    public void destroyCarA(){        System.out.println("CarA的destroy()方法");    }}@Configurationpublic class ConfigTest {    @Bean(initMethod = "initCarA",destroyMethod = "destroyCarA")    public CarA carA(){        return new CarA();    }}

执行结果

CarA。。。构造函数
CarA的init()方法

服务启动

CarA的destroy()方法

2. 方法2:实现接口并重写方法

2.1 示例代码

public class CarB implements InitializingBean, DisposableBean {    public CarB() {        System.out.println("CarB。。。构造函数");    }    @Override    public void afterPropertiesSet() throws Exception {        System.out.println("CarB。。。afterPropertiesSet()方法执行");    }    @Override    public void destroy() throws Exception {        System.out.println("CarB。。。destroy()方法执行");    }}@Configurationpublic class ConfigTest {    @Bean    public CarB carB(){        return new CarB();    }}

执行结果

CarB。。。构造函数
CarB。。。afterPropertiesSet()方法执行

服务启动

CarB。。。destroy()方法执行

2.2 概述

Spring 开放了扩展接口,允许我们自定义 bean 的初始化和销毁方法。即当 Spring 容器在 bean 进行到相应的生命周期阶段时,会自动调用我们自定义的初始化和销毁方法。这两个扩展接口是 InitializingBean 和 DisposableBean 。

InitializingBean 接口说明:该接口为 bean 提供了 bean 属性初始化后的处理方法,它只有 afterPropertiesSet 一个方法,凡是实现此接口的类,在 bean 的属性初始化后都会执行该方法。
package org.springframework.beans.factory;

public interface InitializingBean {    void afterPropertiesSet() throws Exception;}

DisposableBean 接口说明:该接口为单例 bean 提供了在容器销毁 bean 时的处理方法,它只有 destroy 一个方法,凡是实现此接口的类,在 bean 被销毁时都会执行该方法。

package org.springframework.beans.factory;public interface DisposableBean {    void destroy() throws Exception;}

2.3 方法1 && 方法2

  • 相同点:都是在 bean 属性初始化之后需要执行的初始化方法。

  • 不同点

方法1:代码不与Spring耦合;执行效率较低(通过反射来执行initMethod 方法)

方法2:代码与Spring紧耦合;速度更快(将 bean 强制转换成 InitializingBean 接口类型,然后直接调用 afterPropertiesSet 方法)

  • 说明:afterPropertiesSet 和 initMethod 可以同时存在,但是 afterPropertiesSet 方法是在 initMethod 方法之前执行的。

  • 一个 bean 从创建到初始化的过程总结

通过构造器创建 bean

属性注入

执行 afterPropertiesSet 方法

执行 initMethod 方法

3. 方法3:利用java的JSR250规范

代码示例

public class CarC {    public CarC() {        System.out.println("CarC。。。构造函数");    }    @PostConstruct    public void initCarC(){        System.out.println("CarC。。。初始化方法initCarC()");    }    @PreDestroy    public void destroyCarC(){        System.out.println("CarC。。。销毁方法destroyCarC");    }}@Configurationpublic class ConfigTest {    @Bean    public CarC carC(){        return new CarC();    }}

执行结果

CarC。。。构造函数
CarC。。。初始化方法initCarC()

服务启动

CarC。。。销毁方法destroyCarC

spring初始化后获取自定义注解Bean

目的是通过注解将特定类的信息(如接口编号)与类关联,之后可通过接口编号获取对应bean来执行对应逻辑。

一.新建注解类

@Target({ElementType.METHOD, ElementType.TYPE})@Retention(RetentionPolicy.RUNTIME)@Documented@Servicepublic @interface ServiceCode {    String code() default "";     String className() default "";}

包含接口编号和beanName信息。

二.新建接口类

@ServiceCode(code = "100010", className = "echoService")@Service("echoService")public class EchoService { }

三.实现接口ApplicationListener

来监听spring容器初始化完成后执行:

@Component@Order(1)public class ServiceInitListener implements ApplicationListener {    private static final Logger LOGGER = LoggerFactory.getLogger(ServiceInitListener.class);     @Override    public void onApplicationEvent(ContextRefreshedEvent event) {        ApplicationContext applicationContext = event.getApplicationContext();        //注意 需要时根容器才能通过注解获取到bean,比如event直接获取的容器中只有一些公共注册bean        if (applicationContext.getParent() != null) {            applicationContext = applicationContext.getParent();        }        Map beansWithAnnotation = applicationContext.getBeansWithAnnotation(ServiceCode.class);        for (Object bean : beansWithAnnotation.values()) {            ServiceCode annotation = bean.getClass().getAnnotation(ServiceCode.class);            String code = annotation.code();            String className = annotation.className();            //注册接口编号和beanName            //在统一入口可通过code获取beanName,然后通过springContext获取对应bean执行自定义逻辑            //或者完成其他逻辑        }    } }

注意:

ContextRefreshedEvent获取到的上下文环境不是根spring容器,其中只有部分spring内置bean,无法通过注解获取到自定义bean,需要获取其父容器来完成操作。我第一次获取是beanList总为空,后来发现其容器内部bean没有自定义的service bean,获取父容器后操作一切正常。

通过@Order注解来定制执行顺序,越小越优先执行。

以上就是"Bean自定义初始化和销毁方法是什么"这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注行业资讯频道。

方法 接口 容器 注解 函数 代码 只有 属性 知识 篇文章 逻辑 示例 结果 服务 不同 中指 信息 内容 是在 可通 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 亿人帮互联网科技有限公司 云信互联网科技有限公司 中国互联网科技股 西安互联网科技 奔汉互联网科技 阿里互联网科技公司 中化能源互联网科技招聘 互联网5g黑科技有哪些 互联网金融科技元年 南通创西澳互联网科技有限公司 互联网科技融合创新 下一代互联网重大应用科技园 广州有谷有贝互联网科技有限公司 互联网科技企业商标注意事项 三亚科技创新互联网基地 盐城市攀科互联网科技有限公司 安徽九吞吴互联网科技有限公司 青岛互联网科技园 互联网企业和网络科技有限公司 广州全民伙伴互联网科技有限公司 上海卓越科技互联网 互联网和科技创新 互联网科技卖菜 欧洲十大科技互联网公司 互联网金融科技公司干啥的 湖南诚度互联网科技有限公司 玉溪互联网科技怎么选 华夏恒生科技与互联网科技 沐思想互联网科技有限公司 互联网科技和医药行业
0