成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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

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

[[439312]]

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

一、Spring生命周期流程圖

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

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

1.1 Bean創建前的準備階段

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

1.2 創建Bean的實例

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

1.3 開始依賴注入

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

1.4 緩存到Spring容器

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

1.5 銷毀Bean的實例

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

二、代碼實戰演示

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

2.1 準備Author類

1、首先是一個簡單的Bean,調用Bean自身的方法和Bean級生命周期接口方法,為了方便演示,它實現了BeanNameAware、BeanFactoryAware、InitializingBean和DiposableBean這4個接口,同時添加2個init-method和destory-method方法,對應配置文件中的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("【構造器】調用Tom類的構造器實例化"); 
  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.     // 實現BeanFactoryAware接口的方法 
  39.     public void setBeanFactory(BeanFactory beanFactory) throws BeansException { 
  40.         log.info("【BeanFactoryAware接口】調用setBeanFactory方法"); 
  41.         this.beanFactory = beanFactory; 
  42.     } 
  43.  
  44.     // 實現BeanNameAware接口的方法 
  45.     public void setBeanName(String beanName) { 
  46.         log.info("【BeanNameAware接口】調用setBeanName方法"); 
  47.         this.beanName = beanName; 
  48.     } 
  49.  
  50.     // 實現DiposibleBean接口的方法 
  51.     public void destroy() throws Exception { 
  52.         log.info("【DiposibleBean接口】調用destroy方法"); 
  53.     } 
  54.  
  55.     // 實現InitializingBean接口的方法 
  56.     public void afterPropertiesSet() throws Exception { 
  57.         log.info("【InitializingBean接口】調用afterPropertiesSet方法"); 
  58.     } 
  59.  
  60.     // 通過<bean>的init-method屬性指定的初始化方法 
  61.     public void beanInit() { 
  62.         log.info("【init-method】調用<bean>的init-method屬性指定的初始化方法"); 
  63.     } 
  64.  
  65.     // 通過<bean>的destroy-method屬性指定的初始化方法 
  66.     public void beanDestory() { 
  67.         log.info("【destroy-method】調用<bean>的destroy-method屬性指定的初始化方法"); 
  68.     } 

在配置Spring配置文件中加入如下內容:

  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的執行

1.創建GPBeanFactoryPostProcessor類,并實現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("調用BeanFactoryPostProcessor實現類構造器!!"); 
  15.     } 
  16.  
  17.     public void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException { 
  18.         log.info("BeanFactoryPostProcessor調用postProcessBeanFactory方法"); 
  19.         BeanDefinition bd = configurableListableBeanFactory.getBeanDefinition("author"); 
  20.         bd.getPropertyValues().addPropertyValue("age""16"); 
  21.     } 

2.在配置Spring配置文件中加入如下內容:

  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.運行結果

運行結果如下:

  1. 15:49:12.477 [main] INFO com.tom.lifecycle.GPBeanPostProcessor - 調用BeanPostProcessor實現類構造器!! 
  2. 15:49:12.494 [main] INFO com.tom.lifecycle.Author - 【構造器】調用Tom類的構造器實例化 
  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接口】調用setBeanName方法 
  7. 15:49:12.528 [main] INFO com.tom.lifecycle.Author - 【BeanFactoryAware接口】調用setBeanFactory方法 
  8. 15:49:12.528 [main] INFO com.tom.lifecycle.GPBeanPostProcessor - BeanPostProcessor接口方法postProcessBeforeInitialization對屬性進行更改 
  9. 15:49:12.528 [main] INFO com.tom.lifecycle.Author - 【InitializingBean接口】調用afterPropertiesSet方法 
  10. 15:49:12.528 [main] INFO com.tom.lifecycle.Author - 【init-method】調用<bean>的init-method屬性指定的初始化方法 
  11. 15:49:12.528 [main] INFO com.tom.lifecycle.GPBeanPostProcessor - BeanPostProcessor接口方法postProcessAfterInitialization對屬性進行更改 
  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接口】調用destroy方法 
  16. 15:49:12.533 [Thread-0] INFO com.tom.lifecycle.Author - 【destroy-method】調用<bean>的destroy-method屬性指定的初始化方法 

我們看到,整個執行和我們一開始繪制的流程圖一致。但是為什么我們要實現BeanFactoryPostProcessor接口呢?我們進入到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標準初始化之后可以進行修改。將加載所有Bean定義,但是還沒有實例化Bean。這個方法允許重新覆蓋或者添加屬性甚至快速的初始化bean。初次看到可能不知道postProcessBeanFactory()到底是干嘛的。要想透徹理解這個方法的作用,下面來進入到BeanFactoryPostProcessor的源碼,理解一下postProcessBeanFactory()的參數,我們可以利用這些參數做一些操作。

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

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

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

2.3 實現BeanPostProcessor

創建GPBeanPostProcessor類,并實現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("調用BeanPostProcessor實現類構造器!!"); 
  12.     } 
  13.     public Object postProcessBeforeInitialization(Object o, String s) throws BeansException { 
  14.         log.info("BeanPostProcessor接口方法postProcessBeforeInitialization對屬性進行更改"); 
  15.         return o; 
  16.     } 
  17.  
  18.     public Object postProcessAfterInitialization(Object o, String s) throws BeansException { 
  19.         log.info("BeanPostProcessor接口方法postProcessAfterInitialization對屬性進行更改"); 
  20.         return o; 
  21.     } 

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

2.4 實現InstantiationAwareBeanPostProcessor

創建GPInstantiationAwareBeanPostProcessor類,并實現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("調用InstantiationAwareBeanPostProcessorAdapter實現類構造器!!"); 
  16.     } 
  17.  
  18.     // 接口方法、實例化Bean之前調用 
  19.     @Override 
  20.     public Object postProcessBeforeInstantiation(Class beanClass,String beanName) throws BeansException { 
  21.         log.info("InstantiationAwareBeanPostProcessor調用postProcessBeforeInstantiation方法"); 
  22.         return null
  23.     } 
  24.  
  25.     // 接口方法、實例化Bean之后調用 
  26.     @Override 
  27.     public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { 
  28.         log.info("InstantiationAwareBeanPostProcessor調用postProcessAfterInitialization方法"); 
  29.         return bean; 
  30.     } 
  31.  
  32.     // 接口方法、設置某個屬性時調用 
  33.     @Override 
  34.     public PropertyValues postProcessPropertyValues(PropertyValues pvs, PropertyDescriptor[] pds, Object bean, String beanName) throws BeansException { 
  35.         log.info("InstantiationAwareBeanPostProcessor調用postProcessPropertyValues方法"); 
  36.         return pvs; 
  37.     } 

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

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

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

2.5 修改配置文件

完整的配置文件內容如下:

  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 運行結果

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

  1. 15:56:20.030 [main] INFO com.tom.lifecycle.GPBeanFactoryPostProcessor - 調用BeanFactoryPostProcessor實現類構造器!! 
  2. 15:56:20.045 [main] INFO com.tom.lifecycle.GPBeanFactoryPostProcessor - BeanFactoryPostProcessor調用postProcessBeanFactory方法 
  3. 15:56:20.046 [main] INFO com.tom.lifecycle.GPBeanPostProcessor - 調用BeanPostProcessor實現類構造器!! 
  4. 15:56:20.047 [main] INFO com.tom.lifecycle.GPInstantiationAwareBeanPostProcessor - 調用InstantiationAwareBeanPostProcessorAdapter實現類構造器!! 
  5. 15:56:20.051 [main] INFO com.tom.lifecycle.GPInstantiationAwareBeanPostProcessor - InstantiationAwareBeanPostProcessor調用postProcessBeforeInstantiation方法 
  6. 15:56:20.052 [main] INFO com.tom.lifecycle.Author - 【構造器】調用Tom類的構造器實例化 
  7. 15:56:20.069 [main] INFO com.tom.lifecycle.GPInstantiationAwareBeanPostProcessor - InstantiationAwareBeanPostProcessor調用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接口】調用setBeanName方法 
  12. 15:56:20.092 [main] INFO com.tom.lifecycle.Author - 【BeanFactoryAware接口】調用setBeanFactory方法 
  13. 15:56:20.093 [main] INFO com.tom.lifecycle.GPBeanPostProcessor - BeanPostProcessor接口方法postProcessBeforeInitialization對屬性進行更改 
  14. 15:56:20.093 [main] INFO com.tom.lifecycle.Author - 【InitializingBean接口】調用afterPropertiesSet方法 
  15. 15:56:20.093 [main] INFO com.tom.lifecycle.Author - 【init-method】調用<bean>的init-method屬性指定的初始化方法 
  16. 15:56:20.093 [main] INFO com.tom.lifecycle.GPBeanPostProcessor - BeanPostProcessor接口方法postProcessAfterInitialization對屬性進行更改 
  17. 15:56:20.093 [main] INFO com.tom.lifecycle.GPInstantiationAwareBeanPostProcessor - InstantiationAwareBeanPostProcessor調用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接口】調用destroy方法 
  22. 15:56:20.100 [Thread-0] INFO com.tom.lifecycle.Author - 【destroy-method】調用<bean>的destroy-method屬性指定的初始化方法 

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

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

 

責任編輯:姜華 來源: Tom彈架構
相關推薦

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

生命周期流程流程圖

2021-02-23 12:43:39

Redis面試題緩存

2022-03-14 08:54:42

SpringBean生命周期

2012-04-28 13:23:12

Java生命周期

2010-01-26 17:00:31

Android生命周期

2024-01-08 22:08:48

Rust生命周期編程

2009-12-22 10:05:54

WCF編程生命周期

2011-04-19 09:27:25

Spring

2024-03-14 10:47:12

Spring生命周期阿里

2021-01-22 11:58:30

MySQL數據庫開發

2019-12-26 09:52:33

Redis集群線程

2011-08-10 16:50:10

iPhone生命周期

2009-07-31 10:47:18

ASP.NET頁面生命

2015-07-08 16:28:23

weak生命周期

2020-06-10 07:38:30

Spring框架周期

2021-08-05 05:04:50

熱部署模型字節
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美 日韩 国产 在线 | 国产亚洲一区二区精品 | 懂色av色香蕉一区二区蜜桃 | 亚洲性免费 | 久久婷婷色 | 国产婷婷在线视频 | 亚洲午夜精品视频 | 国产成人精品一区二区三区四区 | 日韩精品在线观看一区二区 | av大全在线| 国产www在线| 国产在线观 | 在线播放一区二区三区 | 一区二区三区在线免费观看 | 91视频88av| 亚洲精品视频网站在线观看 | 亚洲美女网站 | 日韩一区三区 | 欧洲一区二区三区 | 国产欧美一区二区三区在线播放 | 久久精品久久久 | av黄色在线观看 | 男人天堂视频在线观看 | 国产视频第一页 | 在线观看中文字幕亚洲 | 伊人国产精品 | 国产男人的天堂 | 亚洲精品国产一区 | 99久久久久久 | 国产成在线观看免费视频 | 草在线| 成人一区二区三区在线观看 | 99久久精品免费视频 | 二区中文 | h视频在线免费 | 国产激情一区二区三区 | 国产美女视频黄a视频免费 国产精品福利视频 | 黄色片视频免费 | 精品日韩一区二区 | 欧美淫 | 在线观看成年视频 |