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

上篇文章主要介绍了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来指定销毁方法。

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");
    }
}

/**
 * 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();
    }
}
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方法。

 @Scope("prototype")
    @Bean(initMethod = "init", destroyMethod = "destory")
    public Car car(){
        return new Car();
    }
  @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。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

后端从入门到精通

你的鼓励是我最大的动力~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值