前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Bean生命周期(2)---Spring源码从入门到精通(八)

Bean生命周期(2)---Spring源码从入门到精通(八)

作者头像
用户9919783
发布2022-07-26 11:38:59
2600
发布2022-07-26 11:38:59
举报
文章被收录于专栏:后端从入门到精通

上篇文章介绍了,可以通过@Bean注解来指定bean创建和销毁方法,init-method和destory-method:

Bean生命周期(1)---Spring源码从入门到精通(七)

这篇主要介绍,InitializingBean, DisposableBean接口 和 @PostConstruct,@PreDestroy注解来实现bean生命周期创建和销毁方法的调用。

1、InitializingBean, DisposableBean

先定义Dog类,实现这两个接口,重写destroy销毁方法,此方法在容器关闭时候调用,重写afterPropertiesSet方法,此方法在容器创建时候调用,意思就是属性设置好之后调用,给Dog类加上前面文章介绍过的@Compoment注解,之后再在config类加上@ComponentScan注解指定扫描的包目录,代码如下:

代码语言:javascript
复制
@Component
public class Dog implements InitializingBean, DisposableBean {
 
    public Dog(){
        System.out.println("Dog... construct");
    }
 
    /**
     * 销毁方法
     * @throws Exception
     */
    public void destroy() throws Exception {
        System.out.println("Dog... destory");
    }
 
    /**
     * 初始化方法
     * @throws Exception
     */
    public void afterPropertiesSet() throws Exception {
        System.out.println("Dog afterPropertiesSet ...");
    }
}
代码语言:javascript
复制
@Configuration
@ComponentScan("com.alibaba.bean")
public class ConfigLifeCycle {
    //@Scope("prototype")
    @Bean(initMethod = "init", destroyMethod = "destory")
    public Car car(){
        return new Car();
    }
}

junitTest代码和上篇文章一样,不变,为了方便理解,我也重新贴一下:

代码语言:javascript
复制
    @Test
    public void test() {
        AnnotationConfigApplicationContext annotationConfigApplicationContext = new AnnotationConfigApplicationContext(
            ConfigLifeCycle.class);
        System.out.println("容器创建完毕");
        //多实例情况下,需要获取组件,才会初始化,并且不会销毁
        //Object carObject = annotationConfigApplicationContext.getBean("car");
 
        //getDefinitionNames(annotationConfigApplicationContext);
        annotationConfigApplicationContext.close();
    }

这时候,我们会打印出来,对象创建construct,初始化init和销毁:

2、@PostConstruct,@PreDestroy

定义cat类,给init和destory方法加这两个注解,顾名思义,PostConstruct注解意思在对象创建之后调用的方法,PreDestroy在销毁之前调用的方法,同样加上component注解,方便一会扫描,代码如下:

代码语言:javascript
复制
@Component
public class Cat {
 
    public Cat(){
        System.out.println("Cat...construct");
    }
 
    /**
     * construct 构造函数创建对象之后执行
     */
    @PostConstruct
    public void init(){
        System.out.println("cat ...PostConstruct.");
    }
 
    /**
     * 销毁之前调用
     */
    @PreDestroy
    public void destory(){
        System.out.println("cat ...PreDestroy");
    }
}

junitTest不变,打印之后如下,正常调用destory和init方法:

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-07-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 后端从入门到精通 微信公众号,前往查看

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

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1、InitializingBean, DisposableBean
  • 2、@PostConstruct,@PreDestroy
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档