Spring bean生命周期不可不知的接口

本人花费半年的时间总结的《Java面试指南》已拿腾讯等大厂offer,已开源在github ,欢迎star!

本文GitHub https://github.com/OUYANGSIHAI/JavaInterview 已收录,这是我花了6个月总结的一线大厂Java面试总结,本人已拿大厂offer,欢迎star

原文链接:blog.ouyangsihai.cn >> Spring bean生命周期不可不知的接口

上回说到 Spring bean生命周期中的InitializingBean接口,我们了解到这只是spring bean生命周期中修改bean的诸多方式之一,其实在整个生命周期中,修改bean的方式大致有如下几种:

  • 实现 InitializingBean接口 的 afterPropertiesSet() 
  • 实现 DisposableBean接口的 destroy()
  • 给方法加@PostConstruct和@PreDestroy注解,需要说明一点,这两个注解是JSR250标准中的,而Spring中InitDestroyAnnotationBeanPostProcessor类实现了这个标准
  • 以xml的方式定义bean时,指定init method和destroy method

    bean id="testBeanLifeCycle" class="org.springframework.samples.mvc.beanPostProcessor.TestBeanLiftCycle"
          init-method="xmlInit" destroy-method="xmlDestroy"
        property name="message" value="Hello World!"//bean
  • 实现 DisposableBean接口的 destroy()

    以xml的方式定义bean时,指定init method和destroy method

    在众多的lifecycle机制中,假设一个bean使用了上边所有的方式,那么它们的执行顺序是这样的:

  • Methods annotated with @PostConstruct
  • afterPropertiesSet() as defined by the InitializingBean callback interface
  • A custom configured init() method
  • Methods annotated with @PreDestroy
  • destroy() as defined by the DisposableBean callback interface
  • A custom configured destroy() method
  • 我们在代码中来看

    在Spring中,bean的生命周期管理都是由beanFactory来管理,上一篇我们有提到,实现了beanFactory的类AbstractAutowiredCapableBeanFactory完成了bean的init和destroy的工作,初始化方法是

    Spring bean生命周期不可不知的接口

    invokeInitMethods方法如下

    Spring bean生命周期不可不知的接口

    接下来看看destroy逻辑,在AbstractAutowiredCapableBeanFactory中我们找到destroy方法

    Spring bean生命周期不可不知的接口

    再来看DisposableBeanAdapter的destroy做了什么

    Spring bean生命周期不可不知的接口

    来看个小demo来验明正身

  • 定义Spring bean TestBeanLifeCycle
  • Spring bean生命周期不可不知的接口
  • 在applicationContext.xml中声明bean
  • Spring bean生命周期不可不知的接口
  • 以Junit方式启动容器
  • Spring bean生命周期不可不知的接口
  • 然后我们会看到下面的输出:
  • Spring bean生命周期不可不知的接口

    说了这么多机制,那么我们在使用的时候要注意什么

    推荐使用@PostConstruct和@PreDestroy,因为这来自JSR250,对Spring框架0耦合。

    除此之外,Spring还提供了LifeCycle接口和LifeCycleProcessor接口,实现这些接口能让bean的lifecycle关联到Container的lifeCycle,当容器有启动,停止,刷新等动作时,会回调到bean。

    如果说所有这些Spring提供的机制还是不能满足你的需求,那么总有一款适合你——BeanPostProcessor接口,事实上在Spring架构内部,众多的beanPostProcessor实现,能完成各种接口的回调,或者自定义方法的触发。关于更多BeanPostProcessor,且听下回分解。

    Spring bean生命周期不可不知的接口

    欢迎关注,期待与您的交流,让我们携手在通往牛逼的小路上徐徐前行。

    本人花费半年的时间总结的《Java面试指南》已拿腾讯等大厂offer,已开源在github ,欢迎star!

    本文GitHub https://github.com/OUYANGSIHAI/JavaInterview 已收录,这是我花了6个月总结的一线大厂Java面试总结,本人已拿大厂offer,欢迎star

    原文链接:blog.ouyangsihai.cn >> Spring bean生命周期不可不知的接口


     上一篇
    Springbean生命周期之Initializing-Bean Springbean生命周期之Initializing-Bean
    Spring 作为一个Ioc容器,它的一个重要职责便是对容器中bean的管理。在Spring中默认bean的scope是singleton,所以这在这里讨论的是该类型的不包括其它作用域的bean. 通俗来讲,Spring beans的生命周
    2021-04-05
    下一篇 
    玩转Spring bean的终极利器 玩转Spring bean的终极利器
    前面的篇幅里有提到通过InitializingBean和Disposable等接口可以对bean的初始化和销毁做一些自定义操作,那么有一点要注意,那仅仅是在bean被容器实例化之后的操作,在spring的世界里,要想对实例化这个过程做点什么
    2021-04-05