spring源碼解讀 | 容器創建過程(繼續學習中...)

spring容器創建過程

寫一個簡單的測試類:

/**
 * @author 孫一鳴 on 2020/2/23
 */
public class test {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(Config.class);
        context.close();
    }
}

查看構造函數:

    public AnnotationConfigApplicationContext(Class<?>... annotatedClasses) {
        this();
        this.register(annotatedClasses);
        this.refresh();
    }

目錄:

查看1號方法:prepareRefresh
查看2號方法:obtainFreshBeanFactory
查看3號方法:prepareBeanFactory
查看4號方法:postProcessBeanFactory
查看5號方法:invokeBeanFactoryPostProcessors
查看6號方法:registerBeanPostProcessors
查看7號方法:initMessageSource
查看8號方法:initApplicationEventMulticaster
查看9號方法:onRefresh
查看10號方法:registerListeners
查看11號方法:finishBeanFactoryInitialization
查看12號方法:finishRefresh

進入refresh方法:

在這裏插入圖片描述
查看1號方法:
方法名稱:prepareRefresh
方法功能:預處理工作
Debug進入這個方法:
在這裏插入圖片描述
在這裏插入圖片描述
查看1號方法:
方法名稱:initPropertySources
方法功能:初始化一些屬性配置,子類自定義個性化的屬性設置方法
Debug進入這個方法:爲空
在這裏插入圖片描述
查看2號方法:
方法名稱: this.getEnvironment().validateRequiredProperties();
方法功能:屬性校驗

查看3號方法:
方法名稱: this.earlyApplicationEvents = new LinkedHashSet();
方法功能:保存容器中的一些早期事件,使用派發器把事件派發出去

========================================================
查看2號方法:
方法名稱:obtainFreshBeanFactory
方法功能:獲取Bean工廠
DefaultListableBeanFactory
Debug進入這個方法:

在這裏插入圖片描述
查看1號方法:
方法名稱: refreshBeanFactory
方法功能:創建了一個BeanFactory對象DefaultListableBeanFactory,設置ID
在這裏插入圖片描述
在這裏插入圖片描述
查看2號方法:
方法名稱: getBeanFactory
方法功能:返回創建好的一個Bean工廠
在這裏插入圖片描述
========================================================
查看3號方法:
方法名稱:prepareBeanFactory
方法功能:Bean工廠 DefaultListableBeanFactory的預準備工作
Debug進入這個方法:

    protected void prepareBeanFactory(ConfigurableListableBeanFactory beanFactory) {
        beanFactory.setBeanClassLoader(this.getClassLoader());
        beanFactory.setBeanExpressionResolver(new StandardBeanExpressionResolver(beanFactory.getBeanClassLoader()));
        beanFactory.addPropertyEditorRegistrar(new ResourceEditorRegistrar(this, this.getEnvironment()));
        beanFactory.addBeanPostProcessor(new ApplicationContextAwareProcessor(this));
        beanFactory.ignoreDependencyInterface(EnvironmentAware.class);
        beanFactory.ignoreDependencyInterface(EmbeddedValueResolverAware.class);
        beanFactory.ignoreDependencyInterface(ResourceLoaderAware.class);
        beanFactory.ignoreDependencyInterface(ApplicationEventPublisherAware.class);
        beanFactory.ignoreDependencyInterface(MessageSourceAware.class);
        beanFactory.ignoreDependencyInterface(ApplicationContextAware.class);
        beanFactory.registerResolvableDependency(BeanFactory.class, beanFactory);
        beanFactory.registerResolvableDependency(ResourceLoader.class, this);
        beanFactory.registerResolvableDependency(ApplicationEventPublisher.class, this);
        beanFactory.registerResolvableDependency(ApplicationContext.class, this);
        beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(this));
        if (beanFactory.containsBean("loadTimeWeaver")) {
            beanFactory.addBeanPostProcessor(new LoadTimeWeaverAwareProcessor(beanFactory));
            beanFactory.setTempClassLoader(new ContextTypeMatchClassLoader(beanFactory.getBeanClassLoader()));
        }

        if (!beanFactory.containsLocalBean("environment")) {
            beanFactory.registerSingleton("environment", this.getEnvironment());
        }

        if (!beanFactory.containsLocalBean("systemProperties")) {
            beanFactory.registerSingleton("systemProperties", this.getEnvironment().getSystemProperties());
        }

        if (!beanFactory.containsLocalBean("systemEnvironment")) {
            beanFactory.registerSingleton("systemEnvironment", this.getEnvironment().getSystemEnvironment());
        }

    }

方法分析:
1)、設置BeanFactory的類加載器、支持表達式解析器…
2)、添加部分BeanPostProcessor【ApplicationContextAwareProcessor】
3)、設置忽略的自動裝配的接口EnvironmentAware、EmbeddedValueResolverAware、xxx;
4)、註冊可以解析的自動裝配;我們能直接在任何組件中自動注入:
BeanFactory、ResourceLoader、ApplicationEventPublisher、ApplicationContext
5)、添加BeanPostProcessor【ApplicationListenerDetector】
6)、添加編譯時的AspectJ;
7)、給BeanFactory中註冊一些能用的組件;
environment【ConfigurableEnvironment】、
systemProperties【Map<String, Object>】、
systemEnvironment【Map<String, Object>】

========================================================
查看4號方法:
方法名稱:this.postProcessBeanFactory(beanFactory);
方法功能:BeanFactory準備完成後的後置處理工作
Debug進入這個方法:
在這裏插入圖片描述
是一個空實現,BeanFactory創建好並且預準備完成後,子類通過重寫這個方法來進行進一步的工作

以上是BeanFactory的預準備工作

查看5號方法:
方法名稱:this.invokeBeanFactoryPostProcessors(beanFactory);
方法功能:執行Bean工廠的後置處理器,在BeanFactory標準初始化之後執行
Debug進入這個方法:

    protected void invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory beanFactory) {
        PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(beanFactory, this.getBeanFactoryPostProcessors());
        if (beanFactory.getTempClassLoader() == null && beanFactory.containsBean("loadTimeWeaver")) {
            beanFactory.addBeanPostProcessor(new LoadTimeWeaverAwareProcessor(beanFactory));
            beanFactory.setTempClassLoader(new ContextTypeMatchClassLoader(beanFactory.getBeanClassLoader()));
        }

    }

方法名稱:invokeBeanFactoryPostProcessors
方法功能:執行Bean工廠的後置處理器
Debug進入這個方法:

在這裏插入圖片描述

=================================================================
查看6號方法:
方法名稱: this.registerBeanPostProcessors(beanFactory);
方法功能:註冊Bean的後置處理器,攔截Bean的創建過程
Debug進入這個方法:
在這裏插入圖片描述
46GG

=================================================================
查看7號方法:
方法名稱: initMessageSource
方法功能:初始化MessageSource組件(做國際化功能;消息綁定,消息解析);
Debug進入這個方法:
在這裏插入圖片描述

=================================================================
查看8號方法:
方法名稱: initApplicationEventMulticaster();
方法功能:初始化事件派發器
Debug進入這個方法:
在這裏插入圖片描述

=================================================================
查看9號方法:
方法名稱: this.onRefresh();
方法功能:留給子容器(子類)
1、子類重寫這個方法,在容器刷新的時候可以自定義邏輯;
Debug進入這個方法:
這個方法爲空實現:在這裏插入圖片描述

=================================================================
查看10號方法:
方法名稱: this.registerListeners();
方法功能:將容器中將所有項目裏面的ApplicationListener註冊進來;
Debug進入這個方法:
在這裏插入圖片描述

=================================================================
查看11號方法:
方法名稱: this.finishBeanFactoryInitialization(beanFactory);
方法功能:初始化剩下的所有單實例Bean
Debug進入這個方法:
在這裏插入圖片描述

方法名稱: preInstantiateSingletons();
方法功能:初始化剩下的所有單實例Bean
Debug進入這個方法:
在這裏插入圖片描述方法名稱: doGetBean()
方法功能:初始化不屬於工廠Bean 的Bean
Debug進入這個方法:

    public Object getBean(String name) throws BeansException {
        return this.doGetBean(name, (Class)null, (Object[])null, false);
    }

在這裏插入圖片描述
方法屬於:doGetBean()
方法名稱: createBean
方法功能:創建Bean
Debug進入這個方法:

在這裏插入圖片描述
這裏面有兩個重要方法:
1.resolveBeanClass

2.resolveBeforeInstantiation(beanName, mbdToUse)

3.doCreateBean

=======================================================
方法屬於:createBean
方法序號:2
方法名稱:resolveBeforeInstantiation(beanName, mbdToUse)
功能:讓BeanPostProcessor先攔截返回代理對象;
進入resolveBeforeInstantiation:
InstantiationAwareBeanPostProcessor】執行時機
在這裏插入圖片描述
方法屬於:createBean
方法序號:3
方法名稱:doCreateBean
功能:創建Bean
Debug進入doCreateBean:
在這裏插入圖片描述

**將創建的Bean添加到緩存中singletonObjects;所有Bean都利用getBean創建完成以後;檢查所有的Bean是否是SmartInitializingSingleton接口的;如果是;就執行afterSingletonsInstantiated();

=================================================================
查看12號方法:
方法名稱: finishRefresh();
方法功能:完成BeanFactory的初始化創建工作;IOC容器就創建完成
Debug進入這個方法:

    protected void finishRefresh() {
        this.initLifecycleProcessor();
        this.getLifecycleProcessor().onRefresh();
        this.publishEvent((ApplicationEvent)(new ContextRefreshedEvent(this)));
        LiveBeansView.registerApplicationContext(this);
    }

1)、initLifecycleProcessor();初始化和生命週期有關的後置處理器;
LifecycleProcessor
默認從容器中找是否有lifecycleProcessor的組件【LifecycleProcessor】;如果沒有new DefaultLifecycleProcessor();
加入到容器;
寫一個LifecycleProcessor的實現類,可以在BeanFactory
void onRefresh();
void onClose();
2)、 getLifecycleProcessor().onRefresh();
拿到前面定義的生命週期處理器(BeanFactory);回調onRefresh();
3)、publishEvent(new ContextRefreshedEvent(this));發佈容器刷新完成事件;
4)、liveBeansView.registerApplicationContext(this);

總結:
1)、Spring容器在啓動的時候,先會保存所有註冊進來的Bean的定義信息;
	1)、xml註冊bean;<bean>
	2)、註解註冊Bean;@Service、@Component、@Bean、xxx
2)、Spring容器會合適的時機創建這些Bean
	1)、用到這個bean的時候;利用getBean創建bean;創建好以後保存在容器中;
	2)、統一創建剩下所有的bean的時候;finishBeanFactoryInitialization();
3)、後置處理器;BeanPostProcessor
	1)、每一個bean創建完成,都會使用各種後置處理器進行處理;來增強bean的功能;
		AutowiredAnnotationBeanPostProcessor:處理自動注入
		AnnotationAwareAspectJAutoProxyCreator:來做AOP功能;
		xxx....
		增強的功能註解:
		AsyncAnnotationBeanPostProcessor
4)、事件驅動模型;
	ApplicationListener;事件監聽;
	ApplicationEventMulticaster;事件派發:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章