Spring Bean的生命週期?緩存
首先說一下Servlet的生命週期:實例化,初始init,接收請求service,銷燬destroy;app
Spring上下文中的Bean生命週期也相似,以下:post
(1)實例化Bean:對象
對於BeanFactory容器,當客戶向容器請求一個還沒有初始化的bean時,或初始化bean的時候須要注入另外一個還沒有初始化的依賴時,容器就會調用createBean進行實例化。對於ApplicationContext容器,當容器啓動結束後,經過獲取BeanDefinition對象中的信息,實例化全部的bean。接口
(2)設置對象屬性(依賴注入):生命週期
實例化後的對象被封裝在BeanWrapper對象中,緊接着,Spring根據BeanDefinition中的信息 以及 經過BeanWrapper提供的設置屬性的接口完成依賴注入。內存
(3)處理Aware接口:it
接着,Spring會檢測該對象是否實現了xxxAware接口,並將相關的xxxAware實例注入給Bean:io
①若是這個Bean已經實現了BeanNameAware接口,會調用它實現的setBeanName(String beanId)方法,此處傳遞的就是Spring配置文件中Bean的id值;容器
②若是這個Bean已經實現了BeanFactoryAware接口,會調用它實現的setBeanFactory()方法,傳遞的是Spring工廠自身。
③若是這個Bean已經實現了ApplicationContextAware接口,會調用setApplicationContext(ApplicationContext)方法,傳入Spring上下文;
(4)BeanPostProcessor:
若是想對Bean進行一些自定義的處理,那麼能夠讓Bean實現了BeanPostProcessor接口,那將會調用postProcessBeforeInitialization(Object obj, String s)方法。因爲這個方法是在Bean初始化結束時調用的,因此能夠被應用於內存或緩存技術;
(5)InitializingBean 與 init-method:
若是Bean在Spring配置文件中配置了 init-method 屬性,則會自動調用其配置的初始化方法。
(6)若是這個Bean實現了BeanPostProcessor接口,將會調用postProcessAfterInitialization(Object obj, String s)方法;
以上幾個步驟完成後,Bean就已經被正確建立了,以後就能夠使用這個Bean了。
(7)DisposableBean:
當Bean再也不須要時,會通過清理階段,若是Bean實現了DisposableBean這個接口,會調用其實現的destroy()方法;
(8)destroy-method:
最後,若是這個Bean的Spring配置中配置了destroy-method屬性,會自動調用其配置的銷燬方法。