<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          深入源碼理解SpringBean生命周期

          共 13601字,需瀏覽 28分鐘

           ·

          2021-05-20 23:02

          點(diǎn)擊上方藍(lán)色字體,選擇“標(biāo)星公眾號(hào)”

          優(yōu)質(zhì)文章,第一時(shí)間送達(dá)

            作者 |  DeepSleeping丶

          來源 |  urlify.cn/jy6NJr

          76套java從入門到精通實(shí)戰(zhàn)課程分享

          概述

          本文描述下Spring的實(shí)例化、初始化、銷毀,整個(gè)SpringBean生命周期,聊一聊BeanPostProcessor的回調(diào)時(shí)機(jī)、Aware方法的回調(diào)時(shí)機(jī)、初始化方法的回調(diào)及其順序、銷毀方法的回調(diào)及其順序、重要的BeanPostProcessor的介紹。
          開頭是一張我畫的調(diào)用流轉(zhuǎn)圖,然后就是我寫的一個(gè)Demo通過日志打印了SpringBean的生命周期,最后通過源碼慢慢跟進(jìn)其生命周期。

          生命周期流轉(zhuǎn)圖

          生命周期Demo

          如下對(duì)某一個(gè)Bean進(jìn)行g(shù)etBean操作,最后銷毀上下文,通過日志來查看SpringBean的生命周期

          代碼

          package com.deepz.spring;

          import lombok.extern.slf4j.Slf4j;
          import org.springframework.beans.BeansException;
          import org.springframework.beans.factory.BeanFactory;
          import org.springframework.beans.factory.BeanFactoryAware;
          import org.springframework.beans.factory.DisposableBean;
          import org.springframework.beans.factory.InitializingBean;
          import org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessor;
          import org.springframework.beans.factory.support.MergedBeanDefinitionPostProcessor;
          import org.springframework.beans.factory.support.RootBeanDefinition;
          import org.springframework.context.ApplicationContext;
          import org.springframework.context.ApplicationContextAware;
          import org.springframework.context.EnvironmentAware;
          import org.springframework.context.annotation.AnnotationConfigApplicationContext;
          import org.springframework.context.annotation.Bean;
          import org.springframework.context.annotation.Configuration;
          import org.springframework.core.env.Environment;
          import org.springframework.stereotype.Component;
          import javax.annotation.PostConstruct;
          import javax.annotation.PreDestroy;

          @Slf4j
          @Configuration
          public class BeanLifeCycleManager {

              public static void main(String[] args) {
                  AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(BeanLifeCycleManager.class);
                  context.getBean("beanLifeCycle");
                  context.close();
              }

              @Bean(initMethod = "init", destroyMethod = "destroyMethod")
              public BeanLifeCycle beanLifeCycle() {
                  return new BeanLifeCycle();
              }

              interface MyAware extends ApplicationContextAware, EnvironmentAware, BeanFactoryAware {

              }

              @Component
              static class MyMergedBeanDefinitionPostProcessor implements MergedBeanDefinitionPostProcessor {

                  @Override
                  public void postProcessMergedBeanDefinition(RootBeanDefinition beanDefinition, Class<?> beanType, String beanName) {
                      if ("beanLifeCycle".equals(beanName)) {
                          log.info(">>>>>>>>>>元信息收集 ,MergedBeanDefinitionPostProcessor#postProcessMergedBeanDefinition(RootBeanDefinition beanDefinition, Class<?> beanType, String beanName) \nbeanDefinition = [{}]\n,beanType = [{}],beanName = [{}]\n", beanDefinition, beanType, beanName);
                      }
                  }
              }

              @Component
              static class MyInstantiationAwareBeanPostProcessor implements InstantiationAwareBeanPostProcessor {
                  @Override
                  public Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException {
                      if ("beanLifeCycle".equals(beanName)) {
                          log.info(">>>>>>>>>>實(shí)例化前,InstantiationAwareBeanPostProcessor#postProcessBeforeInstantiation(Class<?> beanClass,String beanName) \nbeanClass = [{}],beanName = [{}]\n", beanClass, beanName);
                      }
                      return null;
                  }

                  @Override
                  public boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException {
                      if ("beanLifeCycle".equals(beanName)) {
                          log.info(">>>>>>>>>>實(shí)例化后,InstantiationAwareBeanPostProcessor#postProcessAfterInstantiation(Object bean, String beanName)\nbean = [{}],beanName = [{}]\n", bean, beanName);
                      }
                      return false;
                  }

                  @Override
                  public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
                      if ("beanLifeCycle".equals(beanName)) {
                          log.info(">>>>>>>>>>初始化前,InstantiationAwareBeanPostProcessor#postProcessBeforeInitialization(Object bean, String beanName)\nbean= [{}],beanName = [{}]\n", bean, beanName);
                      }
                      return bean;
                  }

                  @Override
                  public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
                      if ("beanLifeCycle".equals(beanName)) {
                          log.info(">>>>>>>>>>初始化后,InstantiationAwareBeanPostProcessor#postProcessAfterInitialization(Object bean, String beanName)\nbean= [{}],beanName = [{}]\n", bean, beanName);
                      }
                      return bean;
                  }
              }

              public static class BeanLifeCycle implements InitializingBean, MyAware, DisposableBean {
                  public void init() {
                      log.info(">>>>>>>>>>init-method\n");
                  }

                  @PostConstruct
                  public void postConstruct() {
                      log.info(">>>>>>>>>>postConstruct\n");
                  }

                  @Override
                  public void afterPropertiesSet() throws Exception {
                      log.info(">>>>>>>>>>afterPropertiesSet\n");
                  }

                  public void destroyMethod() {
                      log.info(">>>>>>>>>>destroy-method\n");
                  }

                  @Override
                  public void destroy() {
                      log.info(">>>>>>>>>>DisposableBean-destroy\n");
                  }

                  @PreDestroy
                  public void preDestroy(){
                      log.info(">>>>>>>>>>preDestroy\n");
                  }


                  @Override
                  public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
                      log.info(">>>>>>>>>>BeanFactoryAware#setBeanFactory\n");
                  }

                  @Override
                  public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
                      log.info(">>>>>>>>>>ApplicationContextAware#setApplicationContext\n");
                  }

                  @Override
                  public void setEnvironment(Environment environment) {
                      log.info(">>>>>>>>>>EnvironmentAware#setEnvironment\n");
                  }
              }
          }

          執(zhí)行結(jié)果

          實(shí)例化前

          從createBean開始,見證Bean的實(shí)例化過程,首先是Bean實(shí)例化前的一個(gè)擴(kuò)展點(diǎn),它允許你自定義返回Bean實(shí)例。(AOP生成代理對(duì)象的入口之一,但基本不會(huì)走這里)

          回調(diào)Bean實(shí)例化前的方法

          AbstractAutowireCapableBeanFactory#createBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args)

          主要是為了回調(diào)所有InstantiationAwareBeanPostProcessor的postProcessBeforeInstantiation(Class<?> beanClass, String beanName)方法,該方法會(huì)返回Object對(duì)象,如果返回的Object不為空,則會(huì)回調(diào)所有BeanPostProcessor的postProcessAfterInitialization(Object bean, String beanName)方法,那么返回的Object則會(huì)作為Bean去處理,如果返回Null,那么后續(xù)就會(huì)交由Spring來實(shí)例化、初始化(doCreateBean)。


          自定義攔截實(shí)例化Bean后回調(diào)Bean后置方法


          實(shí)例化

          AbstractAutowireCapableBeanFactory#doCreateBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args)
          如源碼所示,如果上述擴(kuò)展點(diǎn)沒有return,那么就會(huì)進(jìn)入到doCreateBean方法

          首先是對(duì)Bean進(jìn)行實(shí)例化,其中包括了構(gòu)造器推斷等,本文不過多聊這塊內(nèi)容,最后會(huì)返回BeanWrapper包裹的Bean實(shí)例。

          元信息收集

          實(shí)例化之后Spring通過回調(diào)MergedBeanDefinitionPostProcessor#postProcessMergedBeanDefinition(RootBeanDefinition beanDefinition, Class<?> beanType, String beanName)對(duì)一些元信息做了收集維護(hù)處理,如@Autowire、@Resource、@PostConstruct 和 @PreDestroy等,為后續(xù)屬性注入做準(zhǔn)備。

          MergedBeanDefinitionPostProcessor的實(shí)現(xiàn)類

          MergedBeanDefinitionPostProcessor回調(diào)

          初始化

          實(shí)例化完了,對(duì)一些需要收集的信息也準(zhǔn)備好了,后續(xù)就是進(jìn)行屬性注入和回調(diào)初始化方法了,其中populateBean方法是屬性填充,initializeBean是回調(diào)初始化方法。

          InstatiationAwareBeanPostProcessor回調(diào)postProcessAfterInstantiation方法

          AbstractAutowireCapableBeanFactory#populateBean(String beanName, RootBeanDefinition mbd, @Nullable BeanWrapper bw)

          Aware接口回調(diào)

          AbstractAutowireCapableBeanFactory#initializeBean(final String beanName, final Object bean, @Nullable RootBeanDefinition mbd)

          部分Aware接口回調(diào)、BeanPostProcessor的初始化前置回調(diào)(包括PostConstruct的調(diào)用、其余Aware的回調(diào))、afterPropertiesSet回調(diào)、自定義init方法回調(diào)、BeanPostProcessor的初始化后置回調(diào)

          部分Aware回調(diào)

          AbstractAutowireCapableBeanFactory#invokeAwareMethods(final String beanName, final Object bean

          BeanPostProcessor的初始化前置回調(diào)

          重要BeanPostProcessor如下:

          ApplicationContextAwareProcessor#postProcessBeforeInitialization(final Object bean, String beanName)回調(diào)剩余Aware方法

          InitDestroyAnnotationBeanPostProcessor#postProcessBeforeInitialization(final Object bean, String beanName)回調(diào)PostConstruct方法


          回調(diào)初始化方法

          AbstractAutowireCapableBeanFactory#invokeInitMethods(String beanName, final Object bean, @Nullable RootBeanDefinition mbd)
          先回調(diào)InitializingBean的afterPropertiesSet方法,隨后回調(diào)自定義的init-method

          BeanPostProcessor的初始化后置回調(diào)

          注意:AOP生成代理的主要入口便是這里的了,對(duì)應(yīng)的BeanPostProcessor->AbstractAutoProxyCreator。(后續(xù)單聊AOP相關(guān)源碼,F(xiàn)LAG)

          銷毀

          銷毀方法最終會(huì)走到DisposableBeanAdapter的destroy方法去做處理,與初始化方法類似,這里簡單介紹把。
          看圖就能發(fā)現(xiàn),順序執(zhí)行的,先是注解方法,然后是DisposableBean的回調(diào),最后是自定義的銷毀方法,就是如此簡單。





          粉絲福利:Java從入門到入土學(xué)習(xí)路線圖

          ??????

          ??長按上方微信二維碼 2 秒


          感謝點(diǎn)贊支持下哈 

          瀏覽 38
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  超碰97av人人操人人摸 | 中文在线成人а√天堂官网 | 一级黄色视频在线观看 | 内射视频网站免费观看 | 亚洲激情视频在线 |