首頁 >Java >java教程 >彈簧 - 春絲 - 剝離訂單

彈簧 - 春絲 - 剝離訂單

Mary-Kate Olsen
Mary-Kate Olsen原創
2025-01-29 18:08:15596瀏覽

spring-: spring-bean-lifecycle-execution-order

本文全面解析Spring Bean的生命週期,涵蓋BeanFactory接口的所有相關生命週期接口及方法,完整呈現Bean的運行流程。


一、Spring Bean生命週期邏輯執行順序 (從實例化到銷毀)

(實例化到銷毀)

  1. 加載Bean定義 (元數據處理)

    • Spring從配置文件(@Configuration)、XML文件或組件掃描(@Component)讀取Bean定義。
    • 這是元數據處理步驟,尚未創建任何實例。
    • 相關方法:BeanDefinitionRegistry#registerBeanDefinition()

  1. Bean實例化 (對象創建)

    • 通過以下方式創建實際的Bean對象:
      • 構造函數實例化
      • 工廠方法
    • 相關方法:InstantiationAwareBeanPostProcessor#postProcessBeforeInstantiation()

  1. 設置Bean名稱 (BeanNameAware#setBeanName(String name))

    • 如果Bean實現了BeanNameAware,Spring會調用setBeanName()方法來告知Bean其自身的名稱
    • 這發生在依賴注入之前
    • 用例:如果Bean需要在應用程序上下文中知道其名稱
<code class="language-java">public class MyBean implements BeanNameAware {
    @Override
    public void setBeanName(String name) {
        System.out.println("Bean Name Set: " + name);
    }
}</code>

  1. 設置Bean類加載器 (BeanClassLoaderAware#setBeanClassLoader(ClassLoader classLoader))

    • 如果Bean需要訪問其類加載器,Spring會調用此方法。
    • 用例:如果Bean在運行時動態加載類
<code class="language-java">public class MyBean implements BeanClassLoaderAware {
    @Override
    public void setBeanClassLoader(ClassLoader classLoader) {
        System.out.println("ClassLoader Set!");
    }
}</code>

  1. 設置BeanFactory (BeanFactoryAware#setBeanFactory(BeanFactory factory))

    • Spring將BeanFactory注入到Bean中。
    • 用例:允許Bean以編程方式獲取其他Bean
<code class="language-java">public class MyBean implements BeanFactoryAware {
    @Override
    public void setBeanFactory(BeanFactory beanFactory) {
        System.out.println("BeanFactory Set!");
    }
}</code>

  1. 設置環境 (EnvironmentAware#setEnvironment(Environment environment))

    • 如果Bean需要訪問環境變量和屬性,則會調用此方法。
    • 用例:用於動態訪問application.properties中的值。
<code class="language-java">public class MyBean implements EnvironmentAware {
    @Override
    public void setEnvironment(Environment environment) {
        System.out.println("Environment Set!");
    }
}</code>

  1. 設置嵌入式值解析器 (EmbeddedValueResolverAware#setEmbeddedValueResolver(StringValueResolver resolver))

    • 允許Bean以編程方式解析佔位符(${property})
    • 用例:當Bean需要手動解析佔位符時很有用。
<code class="language-java">public class MyBean implements BeanNameAware {
    @Override
    public void setBeanName(String name) {
        System.out.println("Bean Name Set: " + name);
    }
}</code>

  1. 設置資源加載器 (ResourceLoaderAware#setResourceLoader(ResourceLoader loader))

    • 僅適用於ApplicationContext,用於動態加載資源。
    • 用例:加載文件、類路徑資源或外部資源。

  1. 設置應用程序事件發佈器 (ApplicationEventPublisherAware#setApplicationEventPublisher(ApplicationEventPublisher publisher))

    • 如果Bean需要發布事件,則會調用此方法。
    • 用例:用於廣播事件,例如ContextRefreshedEvent

  1. 設置消息源 (MessageSourceAware#setMessageSource(MessageSource source))

    • 如果Bean需要國際化 (i18n) 支持,Spring 會注入 MessageSource。

  1. 設置ApplicationContext (ApplicationContextAware#setApplicationContext(ApplicationContext ctx))

    • 如果Bean需要訪問整個Spring ApplicationContext,則會調用此方法。
    • 用例:允許動態訪問其他Bean、環境設置等

  1. 設置ServletContext (ServletContextAware#setServletContext(ServletContext ctx))

    • 僅適用於Web應用程序,用於訪問Web上下文信息

  1. 初始化前的後處理 (BeanPostProcessor#postProcessBeforeInitialization())

    • 允許在Bean初始化之前修改Bean。

  1. 自定義初始化

    • InitializingBeanafterPropertiesSet()
    • 自定義 @PostConstruct 方法
    • @Bean 中的自定義 init-method
<code class="language-java">public class MyBean implements BeanClassLoaderAware {
    @Override
    public void setBeanClassLoader(ClassLoader classLoader) {
        System.out.println("ClassLoader Set!");
    }
}</code>

  1. 初始化後的後處理 (BeanPostProcessor#postProcessAfterInitialization())

    • 允許在Bean初始化之後修改Bean。
    • 用例:用於創建代理、日誌記錄或面向方面編程 (AOP)

  1. Bean可供使用

    • Bean已完全初始化並可用於應用程序。

二、銷毀階段 (Bean關閉生命週期)

當應用程序關閉時,Spring會優雅地銷毀Bean

  1. 銷毀前的處理 (DestructionAwareBeanPostProcessor#postProcessBeforeDestruction())

    • 允許在銷毀之前進行清理。
  2. DisposableBeandestroy() 方法

    • 如果Bean實現了DisposableBean,則會調用destroy()
<code class="language-java">public class MyBean implements BeanNameAware {
    @Override
    public void setBeanName(String name) {
        System.out.println("Bean Name Set: " + name);
    }
}</code>
  1. 自定義 @PreDestroy 方法 (首選方法)

    • DisposableBean更現代,在Bean銷毀之前調用。
<code class="language-java">public class MyBean implements BeanClassLoaderAware {
    @Override
    public void setBeanClassLoader(ClassLoader classLoader) {
        System.out.println("ClassLoader Set!");
    }
}</code>
  1. 自定義 destroy-method (如果在 @Bean 中定義)

    • 定義清理邏輯的替代方法。

三、完整流程總結 (最終順序)

? Bean初始化階段

  1. 加載Bean定義
  2. 實例化Bean (new Bean())
  3. setBeanName() (BeanNameAware)
  4. setBeanClassLoader() (BeanClassLoaderAware)
  5. setBeanFactory() (BeanFactoryAware)
  6. setEnvironment() (EnvironmentAware)
  7. setEmbeddedValueResolver() (EmbeddedValueResolverAware)
  8. setResourceLoader() (ResourceLoaderAware)
  9. setApplicationEventPublisher() (ApplicationEventPublisherAware)
  10. setMessageSource() (MessageSourceAware)
  11. setApplicationContext() (ApplicationContextAware)
  12. setServletContext() (ServletContextAware)
  13. postProcessBeforeInitialization() (BeanPostProcessor)
  14. @PostConstruct / afterPropertiesSet()
  15. postProcessAfterInitialization() (BeanPostProcessor)
  16. Bean可供使用

? Bean銷毀階段

  1. postProcessBeforeDestruction() (DestructionAwareBeanPostProcessor)
  2. destroy() (DisposableBean)
  3. @PreDestroy
  4. destroy-method

更多關於BeanFactory接口及其方法的信息,請訪問:https://www.php.cn/link/6759d0996526ddc8e27aa550f0b806b1

祝您編碼愉快! ?

以上是彈簧 - 春絲 - 剝離訂單的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn