我們先來聊聊bean的生命周期:
bean的生命周期圖:
AbstractAutowireCapableBeanFactory的docreateBean()方法(簡單描述):
1.可以根據源碼的時候得出在docreateBean方法里面是bean生命周期的核心邏輯:
//只放了核心邏輯
protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, final @Nullable Object[] args) throws BeanCreationException { // bean初始化第一步:默認調用無參構造實例化Bean // 構造參數依賴注入,就是發生在這一步 if (instanceWrapper == null) { //再這個地方完成了對象的創建,推斷創建構造方法 進入 instanceWrapper = createBeanInstance(beanName, mbd, args); } // Initialize the bean instance. Object exposedObject = bean; try { // bean初始化第二步:填充屬性(DI依賴注入發生在此步驟) // 調用反射和內省去進行屬性設置 // 屬性值需要進行類型轉換,判斷屬性注入是否需要 populateBean(beanName, mbd, instanceWrapper); // bean初始化第三步:調用初始化方法,完成bean的初始化操作(AOP發生在此步驟) exposedObject = initializeBean(beanName, exposedObject, mbd); } }
我們根據Bean生命周期圖進行Bean生命周期的內部講解:
詳細步驟介紹:
實例化:
1:Bean的實例化調用createBeanInstance(beanName, mbd, args)方法默認調用無參構造實例化Bean
依賴注入:
2.Bean的依賴注入 ->調用->populateBean(beanName, mbd, instanceWrapper)方法完成 Bean 中所有屬性值的配置注入,最終核心還是根據PropertyHandler的setValue()方法進行setter方法的調用(注入);
初始化:
3.檢查有無Aware的相關接口設置相關依賴:
3.1.如果Bean 實現了 BeanNameAware 接口,則 Spring 調用 Bean 的 setBeanName() 方法傳入當前 Bean 的 id 值。
3.2.如果 Bean 實現了 BeanFactoryAware 接口,則 Spring 調用 setBeanFactory() 方法傳入當前工廠實例的引用。
3.3.如果 Bean 實現了 ApplicationContextAware 接口,則 Spring 調用 setApplicationContext() 方法傳入當前 ApplicationContext 實例的引用。
.
4.如果 BeanPostProcessor 和 Bean 關聯,spring將調用它們的postProcessBeforeInitialization(Object bean, String beanName)(預初始化)方法它作用是在Bean實例創建成功后進行增強處理(如對Bean進行修改,增加某個功能等)。
5.是否實現InitializingBean接口,如果 Bean 實現了 InitializingBean 接口,則 Spring 將調用 afterPropertiesSet() 方法作用是在bean正式構造完成前增加我們自己自定義的邏輯(只能增加一些額外的邏輯)。
6.是否配置自定義的init方法(比如說配置文件中通過 init-method 屬性指定了初始化方法),配置則執行初始化方法。
7.如果 BeanPostProcessor 和 Bean 關聯,spring將調用它們的postProcessBeforeInitialization(Object bean, String beanName),(預初始化)作用和步驟4一樣,只是時機不一樣,步驟4是初始化前,這是初始化后。
銷毀步驟:
8.如果 Bean 實現了 DisposableBean 接口,則 Spring 會調用 destory() 方法將 Spring 中的 Bean 銷毀
9.如果在配置文件中通過 destory-method 屬性指定了 Bean 的銷毀方法,則 Spring 將調用該方法對 Bean 進行銷毀
總結:
Bean的生命周期基本上分為4大步:
1.Bean的實例化 ->createBeanInstance()
2.Bean的屬性注入(依賴注入) ->populateBean(beanName, mbd, instanceWrapper);
3.Bean的初始化: ->initializeBean(beanName, exposedObject, mbd);
4:Bean的銷毀:是容器關閉時調用的,在ConfigurableApplicationContext類的close()中