精品欧美一区二区三区在线观看 _久久久久国色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ù)棧公眾號

欧美精品在线一区二区三区| 91老师片黄在线观看| 久久精品成人欧美大片| 亚洲高清视频免费| 曰本三级在线| youjizz国产精品| 国产成人啪精品视频免费网| 2017亚洲天堂| 中文一区二区三区四区| 欧美视频专区一二在线观看| 亚洲国产高清国产精品| 国产成人av免费看| 亚洲欧美日本日韩| 日韩在线观看免费高清| 亚洲熟女一区二区| 欧美不卡高清一区二区三区| 国产精品成人网| 国产美女精品久久久| 亚洲GV成人无码久久精品| 久久伦理在线| 亚洲精品v天堂中文字幕 | 日日嗨av一区二区三区四区| 久久精品福利视频| 三级黄色片网站| 精品视频在线观看网站| 色综合久久久久综合99| 国产制服91一区二区三区制服| 性xxxx视频播放免费| 国产一区91精品张津瑜| 国产成人免费91av在线| 一级aaa毛片| 久久精品国产68国产精品亚洲| 亚洲国产成人精品久久| 深夜福利网站在线观看| 久久婷婷五月综合色丁香| 偷拍与自拍一区| 熟女熟妇伦久久影院毛片一区二区| 亚洲日本香蕉视频| 国产69精品久久99不卡| 成人伊人精品色xxxx视频| www.国产一区二区| 国产欧美午夜| 久久久久国产视频| 国产一二三四区| 成人中文在线| 在线播放亚洲激情| 国产手机在线观看| 香蕉视频一区| 日韩av在线导航| 欧美xxxxx少妇| 亚洲综合影院| 日韩写真欧美这视频| 不卡中文字幕在线观看| 高清在线一区| 欧美午夜视频一区二区| 欧美三级在线观看视频| 久久大胆人体| 亚洲成人tv网| 免费观看美女裸体网站 | 日本视频久久久| 毛片视频网站在线观看| 亚洲经典在线看| 午夜精品99久久免费| 日本少妇做爰全过程毛片| 在线成人亚洲| 97视频在线观看网址| 亚洲精品午夜国产va久久成人| 日韩午夜免费视频| 欧洲永久精品大片ww免费漫画| 精品91久久久| 香蕉久久国产| 国产精品成人播放| 中文文字幕一区二区三三| 麻豆国产欧美日韩综合精品二区| 国产精品一区二区电影| 精品一区二区无码| 蜜臀av性久久久久蜜臀aⅴ流畅| 国产精品露脸自拍| 一区二区三区播放| 国产精品影音先锋| 国产视频一区二区不卡| 日韩大胆人体| 亚洲国产精品成人综合| 神马午夜伦理影院| av电影在线免费| 色综合色狠狠天天综合色| 黄色国产小视频| 国产精品毛片无码| 精品播放一区二区| 泷泽萝拉在线播放| 国产精品国产三级国产在线观看 | 日韩一级片网址| 中文字幕精品视频在线| 精品久久久中文字幕| 久久国产视频网站| 97久久久久久久| 狠狠色丁香久久婷婷综| 精品国产一区二区三| 伊人免费在线| 五月激情综合色| 亚洲男人天堂av在线| 日韩电影不卡一区| 久久精品99无色码中文字幕 | 欧美伊人精品成人久久综合97| 欧美性猛交xxxx乱大交91| 六月丁香久久丫| 色偷偷av一区二区三区乱| 国产第一页在线播放| 男人的天堂久久精品| 国产亚洲欧美另类一区二区三区| av中文字幕一区二区三区| 亚洲电影在线播放| 中文字幕在线视频一区二区三区| 欧美亚洲tv| 久久精品电影一区二区| 国产又大又黄又粗| 久久99国产精品免费网站| 久久久久久久久久久久久久久久av| 青青草视频免费在线观看| 中文字幕av不卡| 免费看欧美黑人毛片| 亚洲高清黄色| 日韩午夜小视频| 欧美 日韩 成人| 欧美三级在线| 国产在线播放不卡| 天堂中文字幕在线| 亚洲欧美国产77777| 欧美日韩亚洲国产成人| 日韩中文在线播放| 亚洲а∨天堂久久精品9966 | 国产河南妇女毛片精品久久久 | tube国产麻豆| 麻豆久久久久久| 国产日韩二区| 国产调教视频在线观看| 黄网站色欧美视频| 无码人妻一区二区三区在线视频| 久久不见久久见中文字幕免费| 久久久久五月天| 91精品中文字幕| 国产午夜精品福利| 久久这里只有精品18| 视频精品国内| 日韩在线观看免费高清完整版| 毛片毛片女人毛片毛片| 成人一级片在线观看| 一本二本三本亚洲码 | 欧美国产欧美亚州国产日韩mv天天看完整| 免费看黄在线看| 精品国模一区二区三区欧美| 亚洲人在线观看| 日本一区二区三区四区五区| 国产在线一区观看| 日日噜噜噜夜夜爽爽| 色诱色偷偷久久综合| 在线观看91久久久久久| 国产精品人人人人| av一区二区三区四区| 天天想你在线观看完整版电影免费| 欧美成人app| 中文字幕无线精品亚洲乱码一区 | 91精品尤物| 久久亚洲精品视频| 国产精品久久久久久久久毛片 | 欧美激情第四页| 日韩在线观看| 国产精品十八以下禁看| 成人精品一区二区三区校园激情| 色一情一乱一乱一91av| 黄色激情在线观看| 久久福利精品| 日本福利一区二区三区| 欧美日韩免费观看视频| 国产一区二区三区在线看| 欧美一级做a爰片免费视频| 2022国产精品视频| 亚洲 欧美 另类人妖| 久久精品国产大片免费观看| 国产日韩欧美中文在线播放| 一区二区三区视频在线观看视频| 欧美精品在线视频| 日韩毛片无码永久免费看| 狠狠色狠狠色综合| 国风产精品一区二区| 日韩精品一区二区三区免费视频| 欧美成人免费全部| 国产 欧美 自拍| 婷婷六月综合亚洲| avhd101老司机| 国内不卡的二区三区中文字幕| 影音先锋亚洲视频| 66精品视频在线观看| 26uuu国产精品视频| 你懂的视频在线观看| 色综合久久综合网97色综合 | 在线女人免费视频| 在线观看欧美日韩国产| 国产一区二区女内射| 欧美视频在线观看 亚洲欧| 先锋影音av在线| 国产一区在线看| 黄页网站大全在线观看| 精品少妇av| 成人妇女免费播放久久久| 九色porny视频在线观看| 亚洲色图第一页| 国产裸体永久免费无遮挡| 亚洲一级不卡视频| 国产探花视频在线播放| 黄一区二区三区| 久久国产乱子伦免费精品| 国产精品成人a在线观看| 国内精品**久久毛片app| 中文字幕系列一区| 欧美国产亚洲视频| 巨大荫蒂视频欧美另类大| 欧美sm极限捆绑bd| 午夜视频网站在线观看| 亚洲午夜精品久久久久久久久| 偷偷色噜狠狠狠狠的777米奇| 免费观看久久久4p| www污在线观看| 成人影视亚洲图片在线| 国产精品一区在线观看| 国产成人精品一区二三区在线观看| 高清欧美性猛交xxxx黑人猛交| 高清在线观看av| 亚洲国产精品yw在线观看| 亚洲中文字幕一区二区| 岛国av一区二区三区| 超碰人人人人人人人| 波多野洁衣一区| 欧美一级特黄aaa| 日本网站在线观看一区二区三区| 91.com在线| 国产一区日韩一区| 亚洲一区二区三区在线观看视频| 欧美在线关看| 97久草视频| 亚洲高清影院| 91久久久久久久久| 99精品国自产在线| 欧美性受xxxx白人性爽| 日本h片在线| 久久天天躁狠狠躁老女人| seseavlu视频在线| 这里只有精品视频在线| 日本国产在线| 国产婷婷色综合av蜜臀av| 亚洲欧美另类视频| 日韩视频免费直播| 丰满人妻熟女aⅴ一区| 欧美日高清视频| 欧美成人一区二区视频| 色综合网色综合| 日产精品久久久| 91黄色小视频| av手机天堂网| 日本黄色一区二区| 波多野结衣小视频| 亚洲亚洲精品在线观看| 国产69精品久久久久久久久久| 亚洲一区二区三区四区不卡| 九九九免费视频| 亚洲精品免费在线观看| 久久只有这里有精品| 国产精品久久久久久久久图文区 | 国产亚洲一区二区在线| 免费在线观看污视频| 亚洲欧美日韩国产精品| 嫩草研究院在线观看| 在线看日韩欧美| 在线观看黄av| x99av成人免费| 成人在线影视| 丝袜美腿精品国产二区| 国产激情视频在线| 欧美激情精品久久久久久变态 | 97视频免费看| 浪潮色综合久久天堂| 国产精品久久久久aaaa九色| 国产精品第一| 3d动漫精品啪啪一区二区三区免费| 日韩成人综合网| 国产精品12| 奇米狠狠一区二区三区| 涩涩涩999| 亚洲欧美色图| 精品无码国产一区二区三区av| 国产精品久久久久久模特| 亚洲综合日韩欧美| 国产精品一区一区三区| 你懂的在线观看网站| 久久先锋资源网| 国产精品久久久久久久av| 国产精品不卡视频| 久久精品久久国产| 色又黄又爽网站www久久| 中文字幕 国产精品| 日韩亚洲欧美在线| 麻豆导航在线观看| 久久精品久久久久久国产 免费| 亚洲妇熟xxxx妇色黄| 国产精品久久久亚洲| 日韩一区二区三区精品 | 男女激情无遮挡| 精品中文字幕一区二区小辣椒| 波多野结衣电影免费观看| www.av精品| 可以免费看av的网址| 色综合欧美在线视频区| 国产手机精品视频| 亚洲激情在线观看视频免费| www.成人.com| 91黑丝高跟在线| 欧美v亚洲v综合v国产v仙踪林| 操人视频欧美| 精品国产一区二区三区久久久樱花| 亚洲精品影院| 野花国产精品入口| 久久6免费视频| 国产女人水真多18毛片18精品视频| 国产高潮国产高潮久久久91| 色综合久久精品| 欧美 日韩 国产 成人 在线| 美女av一区二区| 播放一区二区| 久久99精品久久久久久久久久| 久久精品国产68国产精品亚洲| 131美女爱做视频| 国产精品资源网| 99久久久无码国产精品不卡| 午夜精品久久久久久久久久| 老牛影视av牛牛影视av| 久久九九免费视频| 国产a亚洲精品| 另类小说综合网| 久久av在线| 久久久久成人精品无码中文字幕| 综合色天天鬼久久鬼色| 黄色网址中文字幕| 亚洲午夜久久久久久久| 美女露胸视频在线观看| 91在线在线观看| 国产精品久久久久久久久妇女| 五月婷婷之婷婷| 国产女人18毛片水真多成人如厕| 亚洲第一精品在线观看 | 日本韩国一区| 91a在线视频| 久久久免费毛片| 国产xxxx振车| 99免费精品在线| 国产在线一二区| 欧美不卡一二三| av免费在线观看网站| http;//www.99re视频| 亚洲国产精品综合久久久| 奇米视频888| 国产精品午夜免费| 综合久久中文字幕| 国产一区二区三区在线看| 日韩久久一区二区三区| 亚洲国产欧美日韩| 蜜桃传媒麻豆第一区在线观看| 一区二区三区伦理片| 欧美丝袜美女中出在线| 高清日韩av电影| 国产精品福利小视频| 欧美日中文字幕| 日韩av.com| 亚洲卡通动漫在线| 精品人妻aV中文字幕乱码色欲| 大量国产精品视频| 日韩av三区| 国产成人无码一二三区视频| 国产三级精品视频| 中国一区二区视频| 久久精品国产免费观看| 精品久久国产一区| 国产毛片视频网站| 国产女主播一区| 99热精品在线播放| 国色天香2019中文字幕在线观看| 亚洲婷婷丁香| 欧美午夜性生活| 成人欧美一区二区三区1314| 中文字幕一区二区人妻| 欧美大片欧美激情性色a∨久久| 91精品日本| 国产精品亚洲αv天堂无码| 成人欧美一区二区三区小说| 国产a级免费视频| 668精品在线视频| 一区二区三区韩国免费中文网站| 男人搞女人网站| 亚洲黄色免费网站| 日本aaa在线观看| 91免费福利视频|