應用啓動初始化操做的各個方式及區別總結

業務中常常會涉及到一些初始化操做如加載數據到內存,初始化成員變量等等一系列操做。現將各個方式總結一下。web

1、 bean的生命週期

首先咱們要明白一個springboot下Web環境裏面bean的生命週期:spring

  1. bean的實例化
  2. 注入對象屬性
  3. 處理XXXXAware接口,包含EnvironmentAware、EmbeddedValueResolverAware、ResourceLoaderAware、ApplicationEventPublisherAware、MessageSourceAware、ApplicationContextAware,執行其特定的方法。
  4. 掃描全部BeanPostProcessor接口。傳入當前對象執行定義的全部postProcessBeforeInitialization(Object bean, String beanName)方法。
  5. 執行@PostConstruct註解方法
  6. 處理InitializingBean接口的 afterPropertiesSet()方法。
  7. 處理IOC配置文件當前bean配置的init-method方法(不多用)。
  8. 掃描全部的BeanPostProcessor接口。傳入當前對象執行定義的全部postProcessAfterInitialization(Object bean, String beanName)方法。
  9. bean的使用。
  10. 容器刷新完成掃描實現Lifecycle接口的bean根據須要調用其start方法。
  11. 容器刷新完成事件廣播掃描實現ApplicationListener<ContextRefreshedEvent>接口的Bean,並調用其onApplicationEvent方法。
  12. webServer的接口開始開放。
  13. 啓動最後一步掃描實現了ApplicationRunner或CommandRunner的bean,調用其對應方法。
  14. 容器close時掃描實現Lifecycle接口的bean根據須要調用其stop方法。
  15. 當bean銷燬時,通常是例如Spring上下文初始化失敗時,或在Spring容器關閉時(正常關閉kill -15,而不是kill -9),會處理DisposableBean接口的destroy方法以及@PreDestroy註解的方法,其中@PreDestroy註解的方法較DisposableBean接口的destroy方法先執行。

2、給應用添加初始化操做的方式

經常使用的給應用添加初始化操做的方式,按執行順序排列的話:springboot

  1. 實現XXXAware接口。
  2. 實現InitializingBean接口。
  3. 實現ApplicationListener<ContextRefreshedEvent>接口,註冊容器刷新後的監聽器。
  4. 實現接口ApplicationRunner接口。
  5. 實現SmartLifecycle接口。

注:其中1和2的區別是1有特定的用途,用於注入特定的對象,能夠經過@DependOn註解標識依賴的beanName,控制bean之間的初始化順序。3和4的區別是4是整個應用啓動完成後執行,3是在啓動過程當中容器刷新完成的時候。5和3效果差很少,可是5比3早一點post

相關文章
相關標籤/搜索