Spring 中的 bean 生命週期?

這部分網上有很多文章都講到了,下面的內容整理自:https://yemengying.com/2016/07/14/spring-bean-life-cycle/ ,除了這篇文章,再推薦一篇很不錯的文章 :https://www.cnblogs.com/zrtqsk/p/3735273.html

Bean 容器找到配置文件中 Spring Bean 的定義。
Bean 容器利用 Java Reflection API 創建一個Bean的實例。
如果涉及到一些屬性值 利用 set()方法設置一些屬性值。
如果 Bean 實現了 BeanNameAware 接口,調用 setBeanName()方法,傳入Bean的名字。
如果 Bean 實現了 BeanClassLoaderAware 接口,調用 setBeanClassLoader()方法,傳入 ClassLoader對象的實例。如果Bean實現了 BeanFactoryAware 接口,調用 setBeanClassLoader()方法,傳入 ClassLoade r對象的實例。
與上面的類似,如果實現了其他 *.Aware接口,就調用相應的方法。如果有和加載這個 Bean 的 Spring 容器相關的 BeanPostProcessor 對象,執行postProcessBeforeInitialization() 方法如果Bean實現了InitializingBean接口,執行afterPropertiesSet()方法。
如果 Bean 在配置文件中的定義包含 init-method 屬性,執行指定的方法。
如果有和加載這個 Bean的 Spring 容器相關的 BeanPostProcessor 對象,執行postProcessAfterInitialization() 方法
當要銷燬 Bean 的時候,如果 Bean 實現了 DisposableBean 接口,執行 destroy() 方法。
當要銷燬 Bean 的時候,如果 Bean 在配置文件中的定義包含 destroy-method 屬性,執行指定的方法。

在這裏插入圖片描述
可以簡述爲以下九步

  • 實例化bean對象(通過構造方法或者工廠方法)
  • 設置對象屬性(setter等)(依賴注入)
  • 如果Bean實現了BeanNameAware接口,工廠調用Bean的setBeanName()方法傳遞Bean的ID。(和下面的一條均屬於檢查Aware接口)
  • 如果Bean實現了BeanFactoryAware接口,工廠調用setBeanFactory()方法傳入工廠自身
  • 將Bean實例傳遞給Bean的前置處理器的postProcessBeforeInitialization(Object bean, String beanname)方法
  • 調用Bean的初始化方法
  • 將Bean實例傳遞給Bean的後置處理器的postProcessAfterInitialization(Object bean, String beanname)方法
  • 使用Bean
  • 容器關閉之前,調用Bean的銷燬方法
發佈了54 篇原創文章 · 獲贊 2 · 訪問量 2973
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章