業務中常常會涉及到一些初始化操做如加載數據到內存,初始化成員變量等等一系列操做。現將各個方式總結一下。web
1、 bean的生命週期
首先咱們要明白一個springboot下Web環境裏面bean的生命週期:spring
- bean的實例化
- 注入對象屬性
- 處理XXXXAware接口,包含EnvironmentAware、EmbeddedValueResolverAware、ResourceLoaderAware、ApplicationEventPublisherAware、MessageSourceAware、ApplicationContextAware,執行其特定的方法。
- 掃描全部BeanPostProcessor接口。傳入當前對象執行定義的全部postProcessBeforeInitialization(Object bean, String beanName)方法。
- 執行@PostConstruct註解方法
- 處理InitializingBean接口的 afterPropertiesSet()方法。
- 處理IOC配置文件當前bean配置的init-method方法(不多用)。
- 掃描全部的BeanPostProcessor接口。傳入當前對象執行定義的全部postProcessAfterInitialization(Object bean, String beanName)方法。
- bean的使用。
- 容器刷新完成掃描實現Lifecycle接口的bean根據須要調用其start方法。
- 容器刷新完成事件廣播掃描實現ApplicationListener<ContextRefreshedEvent>接口的Bean,並調用其onApplicationEvent方法。
- webServer的接口開始開放。
- 啓動最後一步掃描實現了ApplicationRunner或CommandRunner的bean,調用其對應方法。
- 容器close時掃描實現Lifecycle接口的bean根據須要調用其stop方法。
- 當bean銷燬時,通常是例如Spring上下文初始化失敗時,或在Spring容器關閉時(正常關閉kill -15,而不是kill -9),會處理DisposableBean接口的destroy方法以及@PreDestroy註解的方法,其中@PreDestroy註解的方法較DisposableBean接口的destroy方法先執行。
2、給應用添加初始化操做的方式
經常使用的給應用添加初始化操做的方式,按執行順序排列的話:springboot
- 實現XXXAware接口。
- 實現InitializingBean接口。
- 實現ApplicationListener<ContextRefreshedEvent>接口,註冊容器刷新後的監聽器。
- 實現接口ApplicationRunner接口。
- 實現SmartLifecycle接口。
注:其中1和2的區別是1有特定的用途,用於注入特定的對象,能夠經過@DependOn註解標識依賴的beanName,控制bean之間的初始化順序。3和4的區別是4是整個應用啓動完成後執行,3是在啓動過程當中容器刷新完成的時候。5和3效果差很少,可是5比3早一點post