新聞中心
這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
Spring源碼之Bean實例化基本原理
創(chuàng)建Spring Bean實例化是Spring Bean生命周期的第一階段

Bean的生命周期主要有如下幾個步驟:
「詳細介紹:Spring In Action是這樣講的:」
- 實例化Bean對象,這個時候Bean的對象是非常低級的,基本不能夠被我們使用,因為連最基本的屬性都沒有設(shè)置,可以理解為連Autowired注解都是沒有解析的;
- 填充屬性,當(dāng)做完這一步,Bean對象基本是完整的了,可以理解為Autowired注解已經(jīng)解析完畢,依賴注入完成了;
- 如果Bean實現(xiàn)了BeanNameAware接口,則調(diào)用setBeanName方法;
- 如果Bean實現(xiàn)了BeanClassLoaderAware接口,則調(diào)用setBeanClassLoader方法;
- 如果Bean實現(xiàn)了BeanFactoryAware接口,則調(diào)用setBeanFactory方法;
- 調(diào)用BeanPostProcessor的postProcessBeforeInitialization方法;
- 如果Bean實現(xiàn)了InitializingBean接口,調(diào)用afterPropertiesSet方法;
- 如果Bean定義了init-method方法,則調(diào)用Bean的init-method方法;
- 調(diào)用BeanPostProcessor的postProcessAfterInitialization方法;當(dāng)進行到這一步,Bean已經(jīng)被準備就緒了,一直停留在應(yīng)用的上下文中,直到被銷毀;
- 如果應(yīng)用的上下文被銷毀了,如果Bean實現(xiàn)了DisposableBean接口,則調(diào)用destroy方法,如果Bean定義了destory-method聲明了銷毀方法也會被調(diào)用。
在實例化Bean之前在BeanDefinition里頭已經(jīng)有了所有需要實例化時用到的元數(shù)據(jù),接下來Spring只需要選擇合適的實例化方法以及策略即可。
「BeanDefinition」
Spring容器啟動的時候會定位我們的配置文件,加載文件,并解析成Bean的定義文件BeanDefinition
右邊的Map里存儲這bean之間的依賴關(guān)系的定義BeanDefinition,比如OrderController依賴OrderService這種
實例化方法有兩大類分別是工廠方法和構(gòu)造方法實例化,后者是最常見的。其中Spring默認的實例化方法就是無參構(gòu)造函數(shù)實例化。
如我們在xml里定義的以及用注解標識的bean都是通過默認實例化方法實例化的
實例化方法
「使靜態(tài)工廠方法實例化」
- public class FactoryInstance {
- public FactoryInstance() {
- System.out.println("instance by FactoryInstance");
- }
- }
- public class MyBeanFactory {
- public static FactoryInstance getInstanceStatic(){
- return new FactoryInstance();
- }
- }
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
- factory-method="getInstanceStatic"/>
「使用實例工廠方法實例化」
- public class MyBeanFactory {
- /**
- * 實例工廠創(chuàng)建bean實例
- *
- * @return
- */
- public FactoryInstance getInstance() {
- return new FactoryInstance();
- }
- }
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">


咨詢
建站咨詢
