Spring源碼系列(三):refresh()方法詳解之prepareBeanFactory(beanFactory)方法

一、refresh()方法之prepareBeanFactory(beanFactory)方法

// Prepare the bean factory for use in this context.
prepareBeanFactory(beanFactory);

二、prepareBeanFactory(beanFactory)方法詳解

protected void prepareBeanFactory(ConfigurableListableBeanFactory beanFactory) {
        // Tell the internal bean factory to use the context's class loader etc.
        // 設置類加載器:存在則直接設置/不存在則新建一個默認類加載器
        beanFactory.setBeanClassLoader(getClassLoader());
        // 設置beanFactory的表達式語言處理器,Spring3增加了表達式語言的支持
        // 默認可以使用#{bean.xxx}的形式來調(diào)用相關(guān)屬性值
        beanFactory.setBeanExpressionResolver(new StandardBeanExpressionResolver(beanFactory.getBeanClassLoader()));
        //設置屬性注冊解析器PropertyEditor
        beanFactory.addPropertyEditorRegistrar(new ResourceEditorRegistrar(this, getEnvironment()));

        // Configure the bean factory with context callbacks.
        // 將當前的ApplicationContext對象交給ApplicationContextAwareProcessor類來處理,從而在Aware接口實現(xiàn)類中的注入applicationContext
        // 通過ApplicationContextAwareProcessor#invokeAwareInterfaces進行aware接口信息回調(diào)
        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 interface not registered as resolvable type in a plain factory.
        // MessageSource registered (and found for autowiring) as a bean.
        // 注冊可以解析的自動裝配
        beanFactory.registerResolvableDependency(BeanFactory.class, beanFactory);
        beanFactory.registerResolvableDependency(ResourceLoader.class, this);
        beanFactory.registerResolvableDependency(ApplicationEventPublisher.class, this);
        beanFactory.registerResolvableDependency(ApplicationContext.class, this);

        // Register early post-processor for detecting inner beans as ApplicationListeners.
        //將當前applicationContext交給ApplicationListenerDetector類處理
        beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(this));

        // Detect a LoadTimeWeaver and prepare for weaving, if found.
        // 如果當前BeanFactory包含loadTimeWeaver Bean,說明存在類加載期織入AspectJ,
        // 則把當前BeanFactory交給類加載期BeanPostProcessor實現(xiàn)類LoadTimeWeaverAwareProcessor來處理,
        // 從而實現(xiàn)類加載期織入AspectJ的目的.
        if (beanFactory.containsBean(LOAD_TIME_WEAVER_BEAN_NAME)) {
            beanFactory.addBeanPostProcessor(new LoadTimeWeaverAwareProcessor(beanFactory));
            // Set a temporary ClassLoader for type matching.
            beanFactory.setTempClassLoader(new ContextTypeMatchClassLoader(beanFactory.getBeanClassLoader()));
        }

        // Register default environment beans.
        //注冊當前容器環(huán)境environment組件Bean
        if (!beanFactory.containsLocalBean(ENVIRONMENT_BEAN_NAME)) {
            beanFactory.registerSingleton(ENVIRONMENT_BEAN_NAME, getEnvironment());
        }
        // 注冊系統(tǒng)配置systemProperties組件Bea
        if (!beanFactory.containsLocalBean(SYSTEM_PROPERTIES_BEAN_NAME)) {
            beanFactory.registerSingleton(SYSTEM_PROPERTIES_BEAN_NAME, getEnvironment().getSystemProperties());
        }
        //注冊系統(tǒng)環(huán)境systemEnvironment組件Bean
        if (!beanFactory.containsLocalBean(SYSTEM_ENVIRONMENT_BEAN_NAME)) {
            beanFactory.registerSingleton(SYSTEM_ENVIRONMENT_BEAN_NAME, getEnvironment().getSystemEnvironment());
        }
    }

三、總結(jié)

prepareBeanFactory主要做的:

  1. 設置beanFactory的classLoader為當前context的classLoader。
  2. 設置beanFactory的表達式語言處理器。
  3. 添加Aware回調(diào)接口的后處理器ApplicationContextAwareProcessor。
  4. 設置需要忽略自動裝配的接口。
  5. 增加對AspectJ的支持。
  6. 添加默認的系統(tǒng)環(huán)境bean。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容