首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >JDK源码讲解:Bean生命周期案例(初始化/销毁)

JDK源码讲解:Bean生命周期案例(初始化/销毁)

原创
作者头像
后台技术汇
发布2024-09-24 09:10:50
发布2024-09-24 09:10:50
2340
举报
文章被收录于专栏:后台技术汇后台技术汇

背景

初始化bean

@PostConstruct注解

需要结合@Configuration、@Service、@Component注解一起使用,如此一来会在Bean的依赖注入完成之后, 执行被 @PostConstruct 修饰的方法。注意:一个类只能有一个用 @PostConstruct 修饰的方法。

@Bean(initMethod = "initMethod")

需要结合@Configuration一起使用,用来new一个bean,并初始化bean,最后把构造好的bean,交给Spring容器。

InitializingBean接口

需要实现InitializingBean接口,并覆盖afterPropertiesSet方法,同样是在依赖注入完成之后,进行一些初始化工作,比如:属性值校验等。

销毁bean

@PreDestroy注解

在Spring容器将该bean移除时,会回调被@PreDestroy注解修饰的方法。

@Bean(destroyMethod = "destroyMethod")

需要结合@Configuration一起使用,在初始化bean的时候,声明bean销毁方法

DisposableBean接口

需要实现DisposableBean接口,并覆盖destroy()方法,在bean销毁的时候,进行一些兜底的销毁工作,比如:关闭JDBC连接、Redis连接、Es连接等操作。

实战

普通Bean TestBean

代码语言:txt
复制

@Slf4j
public class TestBean implements DisposableBean {

    private String name;

    public TestBean() {
        log.info("TestBean init");
    }

    public String getName() {
        return name;
    }

    /**
     * 初始化bean方法
     */
    public void initMethod() {
        name = "testBean";
    }

    /**
     * 销毁bean方法
     */
    @PreDestroy
    public void destroyMethod2() {
        log.info("@PreDestroy指定的前置方法: testBean destroyMethod bean销毁方法");
    }

    public void destroyMethod(){
        log.info("@Bean指定的销毁方法:testBean destroyMethod bean销毁方法");
    }

    @Override
    public void destroy() throws Exception {
        log.info("DisposableBean接口指定的销毁方法:testBean destroy bean销毁方法");
    }
}

配置类 TestConfig

代码语言:txt
复制
@Slf4j
@Configuration
public class TestConfig implements InitializingBean {

    @Autowired
    private TestBean testBean;

    private static String DEFAULT_SERVICE_ID = null;
    private static String DEFAULT_SERVICE_NAME = null;

    @Bean(initMethod = "initMethod", destroyMethod = "destroyMethod")
    public TestBean testBean() {
        return new TestBean();
    }

    @PostConstruct
    public void init() {
        log.info("@PostConstruct check autowired, testBean = {}", testBean);
        DEFAULT_SERVICE_ID ="webdoor";
        log.info("@PostConstruct:webdoor DEFAULT_SERVICE_ID = {}", DEFAULT_SERVICE_ID);
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        log.info("afterPropertiesSet check autowired, testBean = {}", testBean);
        DEFAULT_SERVICE_NAME = testBean.getName();
        log.info("@afterPropertiesSet:webdoor DEFAULT_SERVICE_NAME = {}", DEFAULT_SERVICE_NAME);
    }
}

日志

代码语言:txt
复制

 
2024-09-05 16:11:34.822  INFO [web-door,,,] 1069 --- [           main] com.bryant.config.bean_init.TestBean     : TestBean init
2024-09-05 16:11:34.825  INFO [web-door,,,] 1069 --- [           main] com.bryant.config.bean_init.TestConfig   : @PostConstruct check autowired, testBean = com.bryant.config.bean_init.TestBean@33e6bd36
2024-09-05 16:11:34.825  INFO [web-door,,,] 1069 --- [           main] com.bryant.config.bean_init.TestConfig   : @PostConstruct:webdoor DEFAULT_SERVICE_ID = webdoor
2024-09-05 16:11:34.826  INFO [web-door,,,] 1069 --- [           main] com.bryant.config.bean_init.TestConfig   : afterPropertiesSet check autowired, testBean = com.bryant.config.bean_init.TestBean@33e6bd36
2024-09-05 16:11:34.827  INFO [web-door,,,] 1069 --- [           main] com.bryant.config.bean_init.TestConfig   : @afterPropertiesSet:webdoor DEFAULT_SERVICE_NAME = testBean

2024-09-05 16:11:53.153  INFO [web-door,,,] 1069 --- [extShutdownHook] com.bryant.config.bean_init.TestBean     : @PreDestroy指定的前置方法: testBean destroyMethod bean销毁方法
2024-09-05 16:11:53.154  INFO [web-door,,,] 1069 --- [extShutdownHook] com.bryant.config.bean_init.TestBean     : DisposableBean接口指定的销毁方法:testBean destroy bean销毁方法
2024-09-05 16:11:53.154  INFO [web-door,,,] 1069 --- [extShutdownHook] com.bryant.config.bean_init.TestBean     : @Bean指定的销毁方法:testBean destroyMethod bean销毁方法

总结

bean的初始化方法调用位于bean的属性赋值之后,以上三种方式来指定bean的初始化方法,执行顺序如下:

bean的销毁方法调用位于bean(或容器)被销毁的时候,以上三种方式来指定bean的销毁方法的执行顺序如下:

其他文章

微服务重构:Mysql+DTS+Kafka+ElasticSearch解决跨表检索难题

基于SpringMVC的API灰度方案

SQL治理经验谈:索引覆盖

Mybatis链路分析:JDK动态代理和责任链模式的应用

大模型安装部署、测试、接入SpringCloud应用体系

一文带你看懂:亿级大表垂直拆分的工程实践

亿级大表冷热分级的工程实践

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 背景
    • 初始化bean
      • @PostConstruct注解
      • @Bean(initMethod = "initMethod")
      • InitializingBean接口
    • 销毁bean
      • @PreDestroy注解
      • @Bean(destroyMethod = "destroyMethod")
      • DisposableBean接口
  • 实战
    • 普通Bean TestBean
    • 配置类 TestConfig
  • 日志
  • 总结
    • 其他文章
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档