一、Vue 組件生命周期
父子組件生命周期順序:
創建時:
父 beforeCreate → 父 created → 父 beforeMount → 子組件生命周期 → 父 mounted
更新時:
父 beforeUpdate → 子組件更新 → 父 updated。
銷毀時:
父 beforeDestroy → 子組件銷毀 → 父 destroyed。
二、Spring Boot 應用生命周期
Spring Boot 應用從啟動到關閉的全過程可分為三個階段,開發者可通過擴展點介入控制。
- 啟動階段:
初始化SpringApplication:創建實例,準備啟動參數。
運行SpringApplication:調用run()方法啟動應用。
發布事件:ApplicationStartingEvent,標志應用開始啟動。
- 配置加載階段:
加載默認配置:從spring-boot-starter-parent繼承。
加載應用配置:從application.properties或application.yml加載。
加載環境配置:根據激活的Profile加載特定配置。
- Bean創建階段:
組件掃描:掃描帶有@Component等注解的類。
Bean定義:解析@Bean注解的方法。
依賴注入:通過@Autowired等注解注入依賴。
- 上下文刷新階段:
刷新上下文:初始化非懶加載的Bean。
發布事件:ApplicationEnvironmentPreparedEvent、ApplicationPreparedEvent、ApplicationStartedEvent。
- Web服務器啟動階段:
啟動嵌入式服務器:如Tomcat,開始監聽端口。
注冊Servlet和Filter:配置DispatcherServlet處理請求。
應用運行階段:
處理請求:接收并路由HTTP請求到控制器。
定時任務和異步處理:執行@Scheduled任務和@Async方法。
- 關閉階段:
接收關閉信號:如SIGTERM或調用shutdown()。
執行關閉邏輯:停止服務器,銷毀Bean。
發布事件:ApplicationExitEvent,表示應用已退出。
三、Spring Bean 應用生命周期
-
實例化前
元信息解析:容器解析配置文件(XML/Java/注解)中的 Bean 定義,生成 BeanDefinition 對象。
驗證 Bean 的依賴關系是否滿足(如循環依賴檢測) -
實例化
反射創建:通過默認構造函數或無參工廠方法創建 Bean 實例。
單例 vs 原型:
單例(Singleton):容器啟動時立即實例化。
原型(Prototype):每次通過 getBean() 獲取時創建新實例。 -
屬性賦值
依賴注入:通過 @Autowired、@Value 或 XML 的 注入屬性值。
依賴解析:解析 Bean 之間的引用關系,確保依賴項已初始化。 -
初始化前
BeanPostProcessor 前處理:調用 postProcessBeforeInitialization,允許修改 Bean 或添加代理(如 AOP)。 -
初始化
BeanNameAware:注入 Bean 的名稱。
BeanFactoryAware:注入 BeanFactory 實例。
ApplicationContextAware:注入應用上下文。
自定義初始化:
@PostConstruct 注解方法。
實現 InitializingBean 接口的 afterPropertiesSet()。
XML 配置的 init-method。
6. 初始化后
BeanPostProcessor 后處理:調用 postProcessAfterInitialization,完成最終增強(如生成動態代理)。
7. 使用階段
就緒狀態:Bean 已完全初始化,可供應用調用
8. 銷毀前
DestructionAwareBeanPostProcessor 處理:執行銷毀前的擴展邏輯(如關閉資源檢查)。
9. 銷毀
自定義銷毀:
@PreDestroy 注解方法。
實現 DisposableBean 接口的 destroy()。
XML 配置的 destroy-method。
作用域影響:
單例:容器關閉時自動觸發銷毀。
原型/請求/會話:需手動調用 destroy() 或依賴作用域結束。
最佳實踐
資源管理:
在 @PostConstruct 中初始化外部資源(如數據庫連接)。
在 @PreDestroy 中釋放資源(如關閉文件句柄)。
避免循環依賴 單出一篇 :
使用 @Lazy 延遲加載依賴項。
通過接口解耦設計。
作用域選擇:
默認使用單例,頻繁創建或需隔離狀態的 Bean 使用原型。
調試工具:
啟用 DEBUG 日志觀察 Bean 生命周期。
使用 Spring Boot Actuator 的 /beans 端點查看 Bean 狀態。