精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

大廠高頻面試題Spring Bean生命周期詳解

開發(fā) 前端
Spring作為當(dāng)前Java最流行、最強大的輕量級框架。Spring Bean的生命周期也是面試高頻題,了解Spring Bean周期也能更好地幫助我們解決日常開發(fā)中的問題。

[[439312]]

Spring作為當(dāng)前Java最流行、最強大的輕量級框架。Spring Bean的生命周期也是面試高頻題,了解Spring Bean周期也能更好地幫助我們解決日常開發(fā)中的問題。程序員應(yīng)該都知道Spring的基礎(chǔ)容器是ApplicationContext。應(yīng)很多粉絲的強烈建議,本文我來分析分析 ApplicationContext中Bean的生命周期。ApplicationContext是頂層容器接口BeanFactory的實現(xiàn)類,因此,我們了解了ApplicationContext的生命周期邏輯,也基本上了解了其他類型容器的生命周期邏輯。

一、Spring生命周期流程圖

下面先來看一張Spring Bean完整的生命周期流程圖,下圖描述的是從Spring容器初始化Bean開始直到Spring容器銷毀Bean,所經(jīng)歷的關(guān)鍵節(jié)點。

從上圖可以看出,Spring Bean的生命周期管理的基本思路是:在Bean出現(xiàn)之前,先準(zhǔn)備操作Bean的BeanFactory,然后操作完Bean,所有的Bean也還會交給BeanFactory進(jìn)行管理。在所有Bean操作準(zhǔn)備BeanPostProcessor作為回調(diào)。在Bean的完整生命周期管理過程中,經(jīng)歷了以下主要幾個步驟:

1.1 Bean創(chuàng)建前的準(zhǔn)備階段

步驟1:Bean容器在配置文件中找到Spring Bean的定義以及相關(guān)的配置,如init-method和destroy-method指定的方法。步驟2:實例化回調(diào)相關(guān)的后置處理器如BeanFactoryPostProcessor、BeanPostProcessor、InstantiationAwareBeanPostProcessor等

1.2 創(chuàng)建Bean的實例

步驟3:Srping 容器使用Java反射API創(chuàng)建Bean的實例。步驟4:掃描Bean聲明的屬性并解析。

1.3 開始依賴注入

步驟5:開始依賴注入,解析所有需要賦值的屬性并賦值。步驟6:如果Bean類實現(xiàn)BeanNameAware接口,則將通過傳遞Bean的名稱來調(diào)用setBeanName()方法。步驟7:如果Bean類實現(xiàn)BeanFactoryAware接口,則將通過傳遞BeanFactory對象的實例來調(diào)用setBeanFactory()方法。步驟8:如果有任何與BeanFactory關(guān)聯(lián)的BeanPostProcessors對象已加載Bean,則將在設(shè)置Bean屬性之前調(diào)用postProcessBeforeInitialization()方法。步驟9:如果Bean類實現(xiàn)了InitializingBean接口,則在設(shè)置了配置文件中定義的所有Bean屬性后,將調(diào)用afterPropertiesSet()方法。

1.4 緩存到Spring容器

步驟10:如果配置文件中的Bean定義包含init-method屬性,則該屬性的值將解析為Bean類中的方法名稱,并將調(diào)用該方法。步驟11:如果為Bean Factory對象附加了任何Bean 后置處理器,則將調(diào)用postProcessAfterInitialization()方法。

1.5 銷毀Bean的實例

步驟12:如果Bean類實現(xiàn)DisposableBean接口,則當(dāng)Application不再需要Bean引用時,將調(diào)用destroy()方法。步驟13:如果配置文件中的Bean定義包含destroy-method屬性,那么將調(diào)用Bean類中的相應(yīng)方法定義。

二、代碼實戰(zhàn)演示

下面我們用一個簡單的Bean來演示并觀察一下Spring Bean完整的生命周期。

2.1 準(zhǔn)備Author類

1、首先是一個簡單的Bean,調(diào)用Bean自身的方法和Bean級生命周期接口方法,為了方便演示,它實現(xiàn)了BeanNameAware、BeanFactoryAware、InitializingBean和DiposableBean這4個接口,同時添加2個init-method和destory-method方法,對應(yīng)配置文件中的init-method和destroy-method。具體代碼如下:

  1. package com.tom.lifecycle; 
  2.  
  3. import lombok.Data; 
  4. import lombok.extern.slf4j.Slf4j; 
  5. import org.springframework.beans.BeansException; 
  6. import org.springframework.beans.factory.*; 
  7.  
  8. @Slf4j 
  9. @Data 
  10. public class Author implements BeanFactoryAware, BeanNameAware, InitializingBean, DisposableBean { 
  11.     private String name
  12.     private String address; 
  13.     private int age; 
  14.  
  15.     private BeanFactory beanFactory; 
  16.  
  17.     private String beanName; 
  18.  
  19.     public Author() { 
  20.         log.info("【構(gòu)造器】調(diào)用Tom類的構(gòu)造器實例化"); 
  21.     } 
  22.  
  23.     public void setName(String name) { 
  24.         log.info("【注入屬性】name"); 
  25.         this.name = name
  26.     } 
  27.  
  28.     public void setAddress(String address) { 
  29.         log.info("【注入屬性】address"); 
  30.         this.address = address; 
  31.     } 
  32.  
  33.     public void setAge(int age) { 
  34.         log.info("【注入屬性】age"); 
  35.         this.age = age; 
  36.     } 
  37.  
  38.     // 實現(xiàn)BeanFactoryAware接口的方法 
  39.     public void setBeanFactory(BeanFactory beanFactory) throws BeansException { 
  40.         log.info("【BeanFactoryAware接口】調(diào)用setBeanFactory方法"); 
  41.         this.beanFactory = beanFactory; 
  42.     } 
  43.  
  44.     // 實現(xiàn)BeanNameAware接口的方法 
  45.     public void setBeanName(String beanName) { 
  46.         log.info("【BeanNameAware接口】調(diào)用setBeanName方法"); 
  47.         this.beanName = beanName; 
  48.     } 
  49.  
  50.     // 實現(xiàn)DiposibleBean接口的方法 
  51.     public void destroy() throws Exception { 
  52.         log.info("【DiposibleBean接口】調(diào)用destroy方法"); 
  53.     } 
  54.  
  55.     // 實現(xiàn)InitializingBean接口的方法 
  56.     public void afterPropertiesSet() throws Exception { 
  57.         log.info("【InitializingBean接口】調(diào)用afterPropertiesSet方法"); 
  58.     } 
  59.  
  60.     // 通過<bean>的init-method屬性指定的初始化方法 
  61.     public void beanInit() { 
  62.         log.info("【init-method】調(diào)用<bean>的init-method屬性指定的初始化方法"); 
  63.     } 
  64.  
  65.     // 通過<bean>的destroy-method屬性指定的初始化方法 
  66.     public void beanDestory() { 
  67.         log.info("【destroy-method】調(diào)用<bean>的destroy-method屬性指定的初始化方法"); 
  68.     } 

在配置Spring配置文件中加入如下內(nèi)容:

  1. <bean id="author" class="com.tom.lifecycle.Author" 
  2.       init-method="beanInit" 
  3.       destroy-method="beanDestory" 
  4.       scope="singleton" 
  5.       p:name="Tom" p:address="湖南長沙" p:age="18"/> 

2.2 演示BeanFactoryPostProcessor的執(zhí)行

1.創(chuàng)建GPBeanFactoryPostProcessor類,并實現(xiàn)BeanFactoryPostProcessor接口,具體代碼如下:

  1. package com.tom.lifecycle; 
  2.  
  3. import lombok.extern.slf4j.Slf4j; 
  4. import org.springframework.beans.BeansException; 
  5. import org.springframework.beans.factory.config.BeanDefinition; 
  6. import org.springframework.beans.factory.config.BeanFactoryPostProcessor; 
  7. import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; 
  8.  
  9. @Slf4j 
  10. public class GPBeanFactoryPostProcessor implements BeanFactoryPostProcessor{ 
  11.  
  12.     public GPBeanFactoryPostProcessor() { 
  13.         super(); 
  14.         log.info("調(diào)用BeanFactoryPostProcessor實現(xiàn)類構(gòu)造器!!"); 
  15.     } 
  16.  
  17.     public void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException { 
  18.         log.info("BeanFactoryPostProcessor調(diào)用postProcessBeanFactory方法"); 
  19.         BeanDefinition bd = configurableListableBeanFactory.getBeanDefinition("author"); 
  20.         bd.getPropertyValues().addPropertyValue("age""16"); 
  21.     } 

2.在配置Spring配置文件中加入如下內(nèi)容:

  1. <bean id="beanFactoryPostProcessor" class="com.tom.lifecycle.GPBeanFactoryPostProcessor" /> 

3.編寫測試類BeanLifeCycleTest,具體代碼如下:

  1. package com.tom.lifecycle; 
  2.  
  3. import lombok.extern.slf4j.Slf4j; 
  4. import org.springframework.context.ApplicationContext; 
  5. import org.springframework.context.support.ClassPathXmlApplicationContext; 
  6.  
  7. @Slf4j 
  8. public class BeanLifeCycleTest { 
  9.  
  10.     public static void main(String[] args) { 
  11.  
  12.         log.info("====== 開始初始化Spring容器 ========"); 
  13.  
  14.         ApplicationContext factory = new ClassPathXmlApplicationContext("application-beans.xml"); 
  15.  
  16.         log.info("====== 初始化Spring容器成功 ========"); 
  17.  
  18.         //獲取Author實例 
  19.         Author author = factory.getBean("author", Author.class); 
  20.  
  21.         log.info(author.toString()); 
  22.  
  23.         log.info("====== 開始銷毀Spring容器 ========"); 
  24.  
  25.         ((ClassPathXmlApplicationContext) factory).registerShutdownHook(); 
  26.     } 
  27.  

4.運行結(jié)果

運行結(jié)果如下:

  1. 15:49:12.477 [main] INFO com.tom.lifecycle.GPBeanPostProcessor - 調(diào)用BeanPostProcessor實現(xiàn)類構(gòu)造器!! 
  2. 15:49:12.494 [main] INFO com.tom.lifecycle.Author - 【構(gòu)造器】調(diào)用Tom類的構(gòu)造器實例化 
  3. 15:49:12.527 [main] INFO com.tom.lifecycle.Author - 【注入屬性】address 
  4. 15:49:12.528 [main] INFO com.tom.lifecycle.Author - 【注入屬性】age 
  5. 15:49:12.528 [main] INFO com.tom.lifecycle.Author - 【注入屬性】name 
  6. 15:49:12.528 [main] INFO com.tom.lifecycle.Author - 【BeanNameAware接口】調(diào)用setBeanName方法 
  7. 15:49:12.528 [main] INFO com.tom.lifecycle.Author - 【BeanFactoryAware接口】調(diào)用setBeanFactory方法 
  8. 15:49:12.528 [main] INFO com.tom.lifecycle.GPBeanPostProcessor - BeanPostProcessor接口方法postProcessBeforeInitialization對屬性進(jìn)行更改 
  9. 15:49:12.528 [main] INFO com.tom.lifecycle.Author - 【InitializingBean接口】調(diào)用afterPropertiesSet方法 
  10. 15:49:12.528 [main] INFO com.tom.lifecycle.Author - 【init-method】調(diào)用<bean>的init-method屬性指定的初始化方法 
  11. 15:49:12.528 [main] INFO com.tom.lifecycle.GPBeanPostProcessor - BeanPostProcessor接口方法postProcessAfterInitialization對屬性進(jìn)行更改 
  12. 15:49:12.531 [main] INFO com.tom.lifecycle.BeanLifeCycleTest - ====== 初始化Spring容器成功 ======== 
  13. 15:49:12.531 [main] INFO com.tom.lifecycle.BeanLifeCycleTest - Author(name=Tom, address=湖南長沙, age=18, beanFactory=org.springframework.beans.factory.support.DefaultListableBeanFactory@26653222: defining beans [beanPostProcessor,author]; root of factory hierarchy, beanName=author) 
  14. 15:49:12.531 [main] INFO com.tom.lifecycle.BeanLifeCycleTest - ====== 開始銷毀Spring容器 ======== 
  15. 15:49:12.532 [Thread-0] INFO com.tom.lifecycle.Author - 【DiposibleBean接口】調(diào)用destroy方法 
  16. 15:49:12.533 [Thread-0] INFO com.tom.lifecycle.Author - 【destroy-method】調(diào)用<bean>的destroy-method屬性指定的初始化方法 

我們看到,整個執(zhí)行和我們一開始繪制的流程圖一致。但是為什么我們要實現(xiàn)BeanFactoryPostProcessor接口呢?我們進(jìn)入到BeanFactoryPostProcessor的源碼如下:

  1. package org.springframework.beans.factory.config; 
  2.  
  3. import org.springframework.beans.BeansException; 
  4.  
  5. public interface BeanFactoryPostProcessor { 
  6.     void postProcessBeanFactory(ConfigurableListableBeanFactory var1) throws BeansException; 

BeanFactoryPostProcessor接口只有一個postProcessBeanFactory()方法,BeanFactoryPostProcessor:在BeanFactory標(biāo)準(zhǔn)初始化之后可以進(jìn)行修改。將加載所有Bean定義,但是還沒有實例化Bean。這個方法允許重新覆蓋或者添加屬性甚至快速的初始化bean。初次看到可能不知道postProcessBeanFactory()到底是干嘛的。要想透徹理解這個方法的作用,下面來進(jìn)入到BeanFactoryPostProcessor的源碼,理解一下postProcessBeanFactory()的參數(shù),我們可以利用這些參數(shù)做一些操作。

通過參數(shù)來看,只有一個ConfigurableListableBeanFactory類,這個類的可以提供分析、修改Bean定義和預(yù)先實例化單例的功能。我們再進(jìn)入到ConfigurableListableBeanFactory的源碼中:

  1. public interface ConfigurableListableBeanFactory extends ListableBeanFactory, AutowireCapableBeanFactory, ConfigurableBeanFactory { 
  2.  
  3.         //忽略被給定注入依賴類型 ,例如String 
  4.     void ignoreDependencyType(Class<?> var1); 
  5.  
  6.         //略被給定注入依賴接口 。這個通常被使用由ApplicationContext去注冊依賴,可以以多種方式實現(xiàn)。例如BeanFactory通過BeanFactoryAware,ApplicationContext 通過ApplicationContextAware。默認(rèn)情況下,僅BeanFactoryAware接口是被忽略,需要忽略其他接口,調(diào)用此方法 
  7.     void ignoreDependencyInterface(Class<?> var1); 
  8.  
  9.         //注冊一個特定類型依賴伴隨著相應(yīng)的Autowired值。這個是準(zhǔn)備被用于應(yīng)該可以Autowire而不是在這個工廠被定義的Bean的工廠/上下文引用。例如 將ApplicationContext類型的依賴項解析為Bean所在的ApplicationContext實例。注意~在普通的BeanFactory中沒有注冊這樣的默認(rèn)類型,甚至連BeanFactory接口本身都沒有 
  10.     void registerResolvableDependency(Class<?> var1, Object var2); 
  11.  
  12.         //確認(rèn)這個被指定的Bean是否是一個Autowire候選,將被注入到其他聲明匹配類型的依賴的Bean中 
  13.     boolean isAutowireCandidate(String var1, DependencyDescriptor var2) throws NoSuchBeanDefinitionException; 
  14.  
  15.         //根據(jù)指定的beanName返回被注冊的Bean定義,允許訪問其屬性值和構(gòu)造函數(shù)參數(shù)值(可以在BeanFactory后期處理期間被修改)。這個被返回的BeanDefinition對象不應(yīng)該是副本而是原始在工廠被注冊的。這意味著如果需要它可以被轉(zhuǎn)換為更具體的實現(xiàn)類型。注意這個方法只能獲得本地工廠BeanDefinition 
  16.     BeanDefinition getBeanDefinition(String var1) throws NoSuchBeanDefinitionException; 
  17.  
  18.         //凍結(jié)全部Bean定義,給被注冊的Bean定義發(fā)信號告訴它們今后不再被修改和進(jìn)一步后續(xù)處理。它允許Factory去積極緩存Bean定義元數(shù)據(jù) 
  19.     void freezeConfiguration(); 
  20.  
  21.         //返回該工廠的BeanDefinnition是否被凍結(jié) 
  22.     boolean isConfigurationFrozen(); 
  23.  
  24.         //確保所有非懶加載的單例Bean被實例化,包括FactoryBean 
  25.     void preInstantiateSingletons() throws BeansException; 

通過以上演示和分析,我們應(yīng)該大概能夠了解ConfigurableListableBeanFactory的作用,基本就都是對于Bean定義的操作。至此我們還沒有看到BeanPostProcessor 和InstantiationAwareBeanPostProcessor的調(diào)用。下面我們把BeanPostProcessor 和InstantiationAwareBeanPostProcessor的實現(xiàn)補充上來,再看完整的執(zhí)行流程

2.3 實現(xiàn)BeanPostProcessor

創(chuàng)建GPBeanPostProcessor類,并實現(xiàn)BeanPostProcessor 接口,具體代碼如下:

  1. package com.tom.lifecycle; 
  2.  
  3. import lombok.extern.slf4j.Slf4j; 
  4. import org.springframework.beans.BeansException; 
  5. import org.springframework.beans.factory.config.BeanPostProcessor; 
  6.  
  7. @Slf4j 
  8. public class GPBeanPostProcessor implements BeanPostProcessor { 
  9.  
  10.     public GPBeanPostProcessor(){ 
  11.         log.info("調(diào)用BeanPostProcessor實現(xiàn)類構(gòu)造器!!"); 
  12.     } 
  13.     public Object postProcessBeforeInitialization(Object o, String s) throws BeansException { 
  14.         log.info("BeanPostProcessor接口方法postProcessBeforeInitialization對屬性進(jìn)行更改"); 
  15.         return o; 
  16.     } 
  17.  
  18.     public Object postProcessAfterInitialization(Object o, String s) throws BeansException { 
  19.         log.info("BeanPostProcessor接口方法postProcessAfterInitialization對屬性進(jìn)行更改"); 
  20.         return o; 
  21.     } 

ApplicationContext 可以在BeanDefinition中自動檢測到實現(xiàn)了BeanPostProcessor的Bean,并且把這些Bean應(yīng)用于隨后的Bean創(chuàng)建。普通的BeanFactory允許對后處理器進(jìn)行程序化注冊,通過工廠應(yīng)用于所有Bean創(chuàng)建。BeanPostProcessor接口中主要有兩個方法:| 方法名 | 解釋 | | -------- | -------- | | postProcessBeforeInitialization | 在Bean實例化回調(diào)(例如InitializingBean的afterPropertiesSet 或者一個定制的init-method)之前應(yīng)用此BeanPostProcessor | | postProcessAfterInitialization | 在bean實例化回調(diào)(例如InitializingBean的afterPropertiesSet 或者一個定制的init-method)之后應(yīng)用此BeanPostProcessor |

2.4 實現(xiàn)InstantiationAwareBeanPostProcessor

創(chuàng)建GPInstantiationAwareBeanPostProcessor類,并實現(xiàn)InstantiationAwareBeanPostProcessorAdapter接口,具體代碼如下:

  1. package com.tom.lifecycle; 
  2.  
  3. import lombok.extern.slf4j.Slf4j; 
  4. import org.springframework.beans.BeansException; 
  5. import org.springframework.beans.PropertyValues; 
  6. import org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessorAdapter; 
  7.  
  8. import java.beans.PropertyDescriptor; 
  9.  
  10. @Slf4j 
  11. public class GPInstantiationAwareBeanPostProcessor  extends InstantiationAwareBeanPostProcessorAdapter { 
  12.  
  13.     public GPInstantiationAwareBeanPostProcessor() { 
  14.         super(); 
  15.         log.info("調(diào)用InstantiationAwareBeanPostProcessorAdapter實現(xiàn)類構(gòu)造器!!"); 
  16.     } 
  17.  
  18.     // 接口方法、實例化Bean之前調(diào)用 
  19.     @Override 
  20.     public Object postProcessBeforeInstantiation(Class beanClass,String beanName) throws BeansException { 
  21.         log.info("InstantiationAwareBeanPostProcessor調(diào)用postProcessBeforeInstantiation方法"); 
  22.         return null
  23.     } 
  24.  
  25.     // 接口方法、實例化Bean之后調(diào)用 
  26.     @Override 
  27.     public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { 
  28.         log.info("InstantiationAwareBeanPostProcessor調(diào)用postProcessAfterInitialization方法"); 
  29.         return bean; 
  30.     } 
  31.  
  32.     // 接口方法、設(shè)置某個屬性時調(diào)用 
  33.     @Override 
  34.     public PropertyValues postProcessPropertyValues(PropertyValues pvs, PropertyDescriptor[] pds, Object bean, String beanName) throws BeansException { 
  35.         log.info("InstantiationAwareBeanPostProcessor調(diào)用postProcessPropertyValues方法"); 
  36.         return pvs; 
  37.     } 

實現(xiàn)InstantiationAwareBeanPostProcessorAdapter的Bean之后,可以在實例化成功之后,做一些校驗或者補充些內(nèi)容或者把Bean包裝代理注入。實現(xiàn)InstantiationAwareBeanPostProcessorAdapter的Bean之后,不會影響容器正常處理每一個實例化的Bean,其子類僅僅只是根據(jù)需要覆蓋父類的方法。

注意,只有在實際需要 InstantiationAwareBeanPostProcessor 功能時才推薦此基類。如果我們所需要的只是簡單的BeanPostProcessor功能,那么直接實現(xiàn)更簡單的接口即可。

下面詳細(xì)介紹一下InstantiationAwareBeanPostProcessorAdapter接口中的所有方法:

2.5 修改配置文件

完整的配置文件內(nèi)容如下:

  1. <?xml version="1.0" encoding="UTF-8"?> 
  2.  
  3. <beans xmlns="http://www.springframework.org/schema/beans" 
  4.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" 
  5.     xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" 
  6.     xsi:schemaLocation=" 
  7.             http://www.springframework.org/schema/beans  
  8.             http://www.springframework.org/schema/beans/spring-beans-3.2.xsd"> 
  9.  
  10.         <bean id="beanPostProcessor" class="com.tom.lifecycle.GPBeanPostProcessor" /> 
  11.  
  12.         <bean id="beanFactoryPostProcessor" class="com.tom.lifecycle.GPBeanFactoryPostProcessor" /> 
  13.  
  14.         <bean id="instantiationAwareBeanPostProcessor" class="com.tom.lifecycle.GPInstantiationAwareBeanPostProcessor" /> 
  15.  
  16.  
  17.         <bean id="author" class="com.tom.lifecycle.Author" 
  18.                 init-method="beanInit" 
  19.                 destroy-method="beanDestory" 
  20.                 scope="singleton" 
  21.                 p:name="Tom" p:address="湖南長沙" p:age="18"/> 
  22.  
  23. </beans> 

2.6 運行結(jié)果

最后,我們再次運行BeanLifeCycleTest測試類,看到如下運行結(jié)果:

  1. 15:56:20.030 [main] INFO com.tom.lifecycle.GPBeanFactoryPostProcessor - 調(diào)用BeanFactoryPostProcessor實現(xiàn)類構(gòu)造器!! 
  2. 15:56:20.045 [main] INFO com.tom.lifecycle.GPBeanFactoryPostProcessor - BeanFactoryPostProcessor調(diào)用postProcessBeanFactory方法 
  3. 15:56:20.046 [main] INFO com.tom.lifecycle.GPBeanPostProcessor - 調(diào)用BeanPostProcessor實現(xiàn)類構(gòu)造器!! 
  4. 15:56:20.047 [main] INFO com.tom.lifecycle.GPInstantiationAwareBeanPostProcessor - 調(diào)用InstantiationAwareBeanPostProcessorAdapter實現(xiàn)類構(gòu)造器!! 
  5. 15:56:20.051 [main] INFO com.tom.lifecycle.GPInstantiationAwareBeanPostProcessor - InstantiationAwareBeanPostProcessor調(diào)用postProcessBeforeInstantiation方法 
  6. 15:56:20.052 [main] INFO com.tom.lifecycle.Author - 【構(gòu)造器】調(diào)用Tom類的構(gòu)造器實例化 
  7. 15:56:20.069 [main] INFO com.tom.lifecycle.GPInstantiationAwareBeanPostProcessor - InstantiationAwareBeanPostProcessor調(diào)用postProcessPropertyValues方法 
  8. 15:56:20.092 [main] INFO com.tom.lifecycle.Author - 【注入屬性】address 
  9. 15:56:20.092 [main] INFO com.tom.lifecycle.Author - 【注入屬性】age 
  10. 15:56:20.092 [main] INFO com.tom.lifecycle.Author - 【注入屬性】name 
  11. 15:56:20.092 [main] INFO com.tom.lifecycle.Author - 【BeanNameAware接口】調(diào)用setBeanName方法 
  12. 15:56:20.092 [main] INFO com.tom.lifecycle.Author - 【BeanFactoryAware接口】調(diào)用setBeanFactory方法 
  13. 15:56:20.093 [main] INFO com.tom.lifecycle.GPBeanPostProcessor - BeanPostProcessor接口方法postProcessBeforeInitialization對屬性進(jìn)行更改 
  14. 15:56:20.093 [main] INFO com.tom.lifecycle.Author - 【InitializingBean接口】調(diào)用afterPropertiesSet方法 
  15. 15:56:20.093 [main] INFO com.tom.lifecycle.Author - 【init-method】調(diào)用<bean>的init-method屬性指定的初始化方法 
  16. 15:56:20.093 [main] INFO com.tom.lifecycle.GPBeanPostProcessor - BeanPostProcessor接口方法postProcessAfterInitialization對屬性進(jìn)行更改 
  17. 15:56:20.093 [main] INFO com.tom.lifecycle.GPInstantiationAwareBeanPostProcessor - InstantiationAwareBeanPostProcessor調(diào)用postProcessAfterInitialization方法 
  18. 15:56:20.097 [main] INFO com.tom.lifecycle.BeanLifeCycleTest - ====== 初始化Spring容器成功 ======== 
  19. 15:56:20.098 [main] INFO com.tom.lifecycle.BeanLifeCycleTest - Author(name=Tom, address=湖南長沙, age=16, beanFactory=org.springframework.beans.factory.support.DefaultListableBeanFactory@26653222: defining beans [beanPostProcessor,beanFactoryPostProcessor,instantiationAwareBeanPostProcessor,author]; root of factory hierarchy, beanName=author) 
  20. 15:56:20.098 [main] INFO com.tom.lifecycle.BeanLifeCycleTest - ====== 開始銷毀Spring容器 ======== 
  21. 15:56:20.099 [Thread-0] INFO com.tom.lifecycle.Author - 【DiposibleBean接口】調(diào)用destroy方法 
  22. 15:56:20.100 [Thread-0] INFO com.tom.lifecycle.Author - 【destroy-method】調(diào)用<bean>的destroy-method屬性指定的初始化方法 

三、Spring Bean生命周期運行時序圖

最后我們來看一下完整的執(zhí)行時序圖:

 

責(zé)任編輯:姜華 來源: Tom彈架構(gòu)
相關(guān)推薦

2022-10-19 23:28:55

Spring生命周期Bean

2024-05-28 07:55:31

SpringBean用域

2023-12-28 09:59:37

Spring容器XML

2022-09-05 07:06:59

BeanSpring

2020-02-10 19:34:12

生命周期流程流程圖

2025-11-17 07:45:45

SpringBean接口

2022-03-14 08:54:42

SpringBean生命周期

2012-04-28 13:23:12

Java生命周期

2010-01-26 17:00:31

Android生命周期

2021-02-23 12:43:39

Redis面試題緩存

2024-01-08 22:08:48

Rust生命周期編程

2009-12-22 10:05:54

WCF編程生命周期

2024-03-14 10:47:12

Spring生命周期阿里

2011-04-19 09:27:25

Spring

2009-07-31 10:47:18

ASP.NET頁面生命

2011-08-10 16:50:10

iPhone生命周期

2015-07-08 16:28:23

weak生命周期

2021-01-22 11:58:30

MySQL數(shù)據(jù)庫開發(fā)

2020-06-10 07:38:30

Spring框架周期

2019-12-26 09:52:33

Redis集群線程
點贊
收藏

51CTO技術(shù)棧公眾號

国产自产精品| 欧美激情亚洲国产| 日本超碰在线观看| 欧美一卡二卡| 久久久久久久久久久久久夜| 成人国产精品久久久| 国产主播在线播放| 国产精品一区二区99| 91精品国产福利在线观看 | 天天干视频在线| 日本午夜一区二区| 欧美精品日韩www.p站| 亚洲调教欧美在线| 国产精品视频一区视频二区| 欧美日韩性视频| 日韩一二区视频| 国产在线视频福利| av高清不卡在线| 成人久久18免费网站图片| 日韩三级一区二区三区| 91成人超碰| 中文字幕在线国产精品| 无码一区二区精品| 日韩精品一区二区三区中文字幕 | 欧美 日本 亚洲| www视频在线看| 中文字幕av一区二区三区免费看| 黄色91av| 亚洲毛片在线播放| 国产精品影视网| 国产欧美在线视频| 国产精品成人久久久| 国产视频一区三区| 欧美激情一二三| 538任你躁在线精品视频网站| 成人在线电影在线观看视频| 亚洲人成电影网站色…| 中出视频在线观看| 精品三级av在线导航| 日韩欧美电影一区| 黄色aaaaaa| 全球中文成人在线| 欧美日韩另类国产亚洲欧美一级| 日韩视频免费在线播放| xxx欧美xxx| 日韩欧美国产视频| 大肉大捧一进一出好爽视频| 国产理论电影在线| 亚洲国产日韩a在线播放性色| 狠狠精品干练久久久无码中文字幕 | 日韩va亚洲va欧美va久久| 97精品国产91久久久久久| 妺妺窝人体色www婷婷| 欧美不卡在线| 欧美激情一级二级| 可以免费看的av毛片| 一本久道久久久| 热99在线视频| 成人黄色片在线观看| 麻豆精品一区二区综合av| 国产色视频一区| 国产片高清在线观看| 国产精品中文字幕日韩精品| 99视频网站| 少妇av一区二区| 久久这里只精品最新地址| 欧美午夜精品理论片a级大开眼界 欧美午夜精品久久久久免费视 | 亚洲精品一区二区三区樱花 | 欧美福利视频网站| 日韩av无码中文字幕| 一区二区高清| 国产精品色午夜在线观看| 亚洲一级av毛片| 国产一区在线视频| 精品日本一区二区三区在线观看| 嫩草研究院在线观看| 欧美激情中文字幕| 中文字幕欧美人与畜| 青青草视频在线免费直播| 午夜精品久久久久久久久| 妺妺窝人体色www在线小说| 国产超碰精品| 欧美一级黄色录像| 三级电影在线看| 99精品小视频| 久久人人爽人人爽人人片av高清| 亚洲GV成人无码久久精品 | 亚洲成在人线免费| 精品www久久久久奶水| 亚洲美女色播| 亚洲福利视频久久| 99久久99久久精品免费看小说.| 91av精品| 日本高清久久天堂| 国产伦精品一区二区三区四区| 成人性生交大合| 日本最新一区二区三区视频观看| 污污的视频在线观看| 色婷婷av一区| 潘金莲一级淫片aaaaa| 激情综合网五月| 色综合天天狠天天透天天伊人| 97人妻一区二区精品视频| 国产精品88888| 日韩电影免费观看在| 黄色在线看片| 欧美精品日韩精品| 国产成人av一区二区三区不卡| 欧美日韩伊人| 国产精品亚洲精品| 婷婷在线观看视频| 亚洲欧美激情在线| 国产av人人夜夜澡人人爽| 粉嫩av一区二区| 另类专区欧美制服同性| 婷婷激情五月综合| 99精品视频一区| 亚洲中文字幕无码一区二区三区| 九九热这里有精品| 亚洲开心激情网| 亚洲av无码一区二区三区在线| 巨乳诱惑日韩免费av| 国产三区精品| sm在线观看| 欧美一级视频精品观看| 亚洲色图日韩精品| 日韩av中文在线观看| 蜜桃999成人看片在线观看| 久久99亚洲网美利坚合众国| 日韩一区二区在线看片| 91免费公开视频| 另类小说综合欧美亚洲| 日韩欧美视频第二区| 日韩一区二区三区免费| 精品伊人久久97| 中文字幕一区二区三区精品| 处破女av一区二区| 国产精品videossex国产高清| 国产成人免费av一区二区午夜| 在线观看欧美视频| 中文字幕在线天堂| 久久久久久久久久久久久女国产乱| 免费毛片小视频| 日韩电影在线观看完整免费观看| 97久久久久久| 天天射天天色天天干| 亚洲成人av中文| 喷水视频在线观看| 日韩视频一区| 欧美久久在线| 久久99久久99精品免观看软件| 亚洲人午夜精品免费| 狠狠狠狠狠狠狠| 欧美国产成人在线| 三年中文在线观看免费大全中国| 国产精品成人av| 亚洲aaa激情| 欧美伦理免费在线| 亚洲国产欧美自拍| 4438国产精品一区二区| 欧美激情在线看| 亚洲午夜激情影院| 欧美三级乱码| 欧美日韩三区四区| 成人影院在线免费观看| 久久综合亚洲社区| 色一情一乱一乱一区91av| 欧美性高跟鞋xxxxhd| 日本免费www| 国产成人鲁色资源国产91色综| a级免费在线观看| 一区二区美女| 国产精品视频久久久| 免费不卡视频| 亚洲的天堂在线中文字幕| 国产精品久久久久久久久久久久久久久久久| 91蜜桃免费观看视频| 亚洲欧美国产中文| 欧美精品观看| 日韩av一级大片| 日韩精品久久久久久久软件91| 91av在线免费观看| 麻豆传媒在线观看| 亚洲第一网站男人都懂| 一级久久久久久| 亚洲风情在线资源站| 18精品爽国产三级网站| 成人在线视频一区二区| 欧美自拍小视频| 伊人影院久久| 一级做a爰片久久| 久久大胆人体视频| 91九色国产在线| 日韩免费电影| 欧美激情综合亚洲一二区 | 亚洲欧洲精品一区二区精品久久久| 黑人巨大猛交丰满少妇| 日韩电影免费一区| 分分操这里只有精品| 999国产精品视频| 久久久免费看| 无码国模国产在线观看| 国产精品嫩草影院一区二区| 不卡视频观看| 欧美成人国产va精品日本一级| 毛片免费在线观看| 亚洲国产欧美一区二区丝袜黑人 | 国产亚洲精品一区二区| 午夜精品久久久久久久99| 欧美亚洲日本国产| 天天操天天操天天操天天| 一区二区三区在线观看动漫| 亚洲精品一区二区三区影院忠贞| yourporn久久国产精品| 91插插插影院| 久久超级碰视频| www.日本xxxx| 久久国产精品久久w女人spa| 僵尸世界大战2 在线播放| 中文精品电影| 伊人久久大香线蕉精品 | av中文字幕av| 欧美国产小视频| 奇米视频888战线精品播放| 国产精品久久久网站| 99在线视频首页| 免费一级欧美在线大片| 成人久久一区二区| jizz久久久久久| 国产精品视频导航| 性欧美freehd18| 国产不卡精品视男人的天堂| 在线成人av观看| 欧美亚洲激情在线| jk漫画禁漫成人入口| 欧美与欧洲交xxxx免费观看 | 国产美女91呻吟求| 久久人体av| 91精品久久久久久久久中文字幕| 欧美国产日韩电影| 国产精品久久久久99| 日韩国产网站| 国产精品国产亚洲伊人久久| 中文另类视频| 国产精品视频精品| 亚洲伊人伊成久久人综合网| 成人免费福利在线| 欧美日本三级| 懂色中文一区二区三区在线视频| 91国内精品| 好看的日韩精品视频在线| 97一区二区国产好的精华液| 国产精品久久久久久久久久久久午夜片 | 91免费看网站| 77成人影视| 久久影院理伦片| 成人在线免费观看视频| 亚洲午夜精品一区二区三区| 久久久久久美女精品| www.av91| 久久综合网络一区二区| 一区二区三区视频在线观看免费| 麻豆精品一区二区综合av| 亚洲女人在线观看| 成人h版在线观看| 日韩中文字幕电影| 国产精品少妇自拍| 久久久久人妻一区精品色欧美| 午夜欧美一区二区三区在线播放| 久久国产视频精品| 欧美视频在线播放| 国产sm主人调教女m视频| 亚洲大胆美女视频| 番号在线播放| 欧美日韩国产第一页| 在线天堂新版最新版在线8| 国产精品∨欧美精品v日韩精品| 91精品国产色综合久久不卡粉嫩| 俄罗斯精品一区二区| 精品一区免费| 一区二区三区四区欧美日韩| 亚洲国产精品久久久久蝴蝶传媒| 成人在线观看你懂的| 日本va欧美va精品发布| 国产ts在线观看| 欧美国产视频在线| 麻豆chinese极品少妇| 色婷婷av久久久久久久| 性做久久久久久久久久| 亚洲视频在线视频| 污片视频在线免费观看| 国产成人精品a视频一区www| 激情久久免费视频| 日韩性感在线| 999亚洲国产精| 思思久久精品视频| 91免费视频网址| 青青操视频在线播放| 91精品办公室少妇高潮对白| 午夜精品久久久久久久99老熟妇| 国产一区二区免费| 国产资源在线观看入口av| 亚洲最大的av网站| 视频一区中文| 人体内射精一区二区三区| 蓝色福利精品导航| 国产精品扒开腿做爽爽| 亚洲一区国产视频| 国产精品久久久久毛片| 亚洲欧美综合精品久久成人| 女人黄色免费在线观看| 成人国产在线激情| 国产伦精品一区二区三区千人斩| 成人性生活视频免费看| 国产乱国产乱300精品| 四虎国产成人精品免费一女五男| 一本色道久久综合亚洲aⅴ蜜桃| 亚洲欧美高清视频| 久久视频在线直播| 国产亚洲精品精品国产亚洲综合| 久草一区二区| 日韩视频一区| 午夜剧场免费看| 一区二区三区四区视频精品免费| 在线观看亚洲国产| 亚洲香蕉成人av网站在线观看| 三级中文字幕在线观看| 国产伦精品一区二区三| 欧美精品不卡| 久久久久无码国产精品一区李宗瑞| 国产精品卡一卡二| 中文字幕永久在线观看| 亚洲欧美另类人妖| 另类专区亚洲| 欧美日韩精品一区| 久久狠狠婷婷| 成人免费毛片糖心| 欧美伊人精品成人久久综合97| 青青色在线视频| 国产福利精品av综合导导航| 婷婷精品在线| 99精品在线免费视频| 91小视频免费看| 国产美女激情视频| 亚洲人av在线影院| 日韩制服诱惑| 正在播放亚洲| 国产激情精品久久久第一区二区| 九九这里只有精品视频| 欧美一区二区三区四区在线观看 | 国产一区二区亚洲| 亚洲成人福利在线观看| 中文字幕中文字幕一区| 国产三级第一页| 高清欧美性猛交| 欧美男人操女人视频| 日本va中文字幕| 国产精品无码永久免费888| 91片黄在线观看喷潮| 美日韩在线视频| 红杏一区二区三区| 91看片就是不一样| 亚洲欧洲韩国日本视频| 国产女人爽到高潮a毛片| 久久久久久久一| 欧美极品在线观看| 天天干天天操天天做| 亚洲精品国产无套在线观| 欧美 日韩 国产 精品| 日韩美女视频免费看| 清纯唯美综合亚洲| 日韩高清一二三区| 高跟丝袜一区二区三区| a√资源在线| 粉嫩av一区二区三区免费观看| 国产视频欧美| 影音先锋男人资源在线观看| 精品国产一区久久| 二吊插入一穴一区二区| av电影一区二区三区| 91免费观看视频在线| 亚洲天堂视频网| 久久免费精品日本久久中文字幕| 久久不见久久见国语| 久久无码人妻一区二区三区| 欧美视频在线观看 亚洲欧| 欧洲美女少妇精品| 久久五月天婷婷| 国产精品一区在线| 日本高清不卡码| 久久99久久99精品中文字幕| 国产伦一区二区三区| 国内自拍偷拍视频| 欧美亚洲一区二区在线| 9999精品成人免费毛片在线看| 日韩精彩视频| 91原创在线视频| 精品国产区一区二| 国产精品久久色| av不卡在线|