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

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

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

上篇文章主要介绍了FactoryBean接口,实现后,可以注入bean,在ioc容器中默认放的是getObject返回的bean:

Spring源码从入门到精通---FactoryBean接口(六)

这篇文章主要介绍Bean的生命周期,bean的生命周期指:bean的创建--->初始化--->销毁

1、问?bean初始化的时候?

单实例是在容器创建时bean初始化,调用construct。

多实例实在获取实例的时候初始化。

2、问?bean销毁的时候?

单实例在容器关闭的时候销毁。

多实例在容器关闭时候并不会销毁,多实例的对象不归ioc容器管理。

一、单实例生命周期创建和销毁

自定义car,里面写个无参构造方法,init,destory,自定义配置类,用@Bean注解的init-Method来指定初始化方法和destory-Method来指定销毁方法。

代码语言:javascript
复制
public class Car {
 
    public Car(){
        System.out.println("car ... construct");
    }
 
    private void init(){
        System.out.println("car ... init");
    }
 
    private void destory(){
        System.out.println("car ... destory");
    }
}
代码语言:javascript
复制
 
/**
 * bean生命周期:
 *    bean创建 ---> 初始化 ---> 销毁
 * 容器管理bean的生命周期
 * 我们可以自定义初始化和销毁,bean进行到当前生命周期的时候,调用自定义的创建和销毁
 *
 *  单实例,容器创建的时候construct创建对象和init初始化。
 *        多实例,获取对象的时候construct创建对象和init初始化。不会交给ioc容器管理,所以容器关        
 *         闭不会销毁。
 *  1)通过@Bean注释 init-method和destory-method的两个方法,指定对象的创建和销毁。
 *    什么时候调用:初始化,对象创建完成,并且赋值好,开始调用。
 *                销毁,容器关闭的时候调用。(多实例的时候不会调用销毁,因为容器不会管理这个bean)
 *
 * @author keying
 */
@Configuration
public class ConfigLifeCycle {
    //@Scope("prototype")
    @Bean(initMethod = "init", destroyMethod = "destory")
    public Car car(){
        return new Car();
    }
}
代码语言:javascript
复制
public class TestLiftCycle {
 
 
    @Test
    public void test() {
        AnnotationConfigApplicationContext annotationConfigApplicationContext = new AnnotationConfigApplicationContext(
            ConfigLifeCycle.class);
        System.out.println("容器创建完毕");
        //多实例情况下,需要获取组件,才会初始化,并且不会销毁
        //Object carObject = annotationConfigApplicationContext.getBean("car");
 
        //getDefinitionNames(annotationConfigApplicationContext);
        annotationConfigApplicationContext.close();
    }
 
 
}

用junit打印之后,可以看到,单实例的情况下,在容器创建完毕之前,会调用构造函数construct创建对象和init初始化,在注解AnnotationConfigApplicationContext获取的容器关闭之后,会调用destory销毁。

二、多实例生命周期创建和销毁

多实例就可以用到之前的注解,吧@Scope指定多实例,并且需要 获取组件,因为多实例在getBean的时候才会创建对象调用construct和调用初始化init方法。

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

结果如下,可以看到,destory并不会调用,并且是在ioc容器加载完毕之后才初始化bean。

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

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

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

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

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