1. 程式人生 > 其它 >Spring原始碼閱讀 - prepareBeanFactory

Spring原始碼閱讀 - prepareBeanFactory

1. 概述

前面說到 Reader 例項化時註冊了一些 BD 進入容器。
在 refresh 過程中,也注入了一些 Bean 到容器,注意這裡注入的不是 BD 而是直接注入 Bean。

2. prepareBeanFactory

org.springframework.context.support.AbstractApplicationContext#prepareBeanFactory

    protected void prepareBeanFactory(ConfigurableListableBeanFactory beanFactory) {
        // 注意看下面的,下面要麼是直接設定 BeanFactory 的屬性,要麼是直接向 BeanFactory 注入 Bean 例項而非注入 BeanDefinition

        // Tell the internal bean factory to use the context's class loader etc.
        beanFactory.setBeanClassLoader(getClassLoader());
        /// SpEL 表示式,Spring Expression Language,插值表示式?SpEL?
        if (!shouldIgnoreSpel) {
            beanFactory.setBeanExpressionResolver(new StandardBeanExpressionResolver(beanFactory.getBeanClassLoader()));
        }
        // 屬性編輯器?
        beanFactory.addPropertyEditorRegistrar(new ResourceEditorRegistrar(this, getEnvironment()));

        // Configure the bean factory with context callbacks.
        // 處理器,處理一些介面回撥,呼叫介面,傳入一些 Spring 內部的物件, 都是一些 Aware 介面, 內部可以看到支援的介面, 最頂層都是 Aware 介面
        // 顯然這些呼叫都是在 Bean 被例項化之後的事
        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.ignoreDependencyInterface(ApplicationStartupAware.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.
        // 繼承了 ApplicationListener 介面的處理,處理了什麼?
        beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(this));

        // Detect a LoadTimeWeaver and prepare for weaving, if found.
        // 不瞭解
        if (!NativeDetector.inNativeImage() && 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.
        // environment
        if (!beanFactory.containsLocalBean(ENVIRONMENT_BEAN_NAME)) {
            beanFactory.registerSingleton(ENVIRONMENT_BEAN_NAME, getEnvironment());
        }
        // systemProperties
        if (!beanFactory.containsLocalBean(SYSTEM_PROPERTIES_BEAN_NAME)) {
            beanFactory.registerSingleton(SYSTEM_PROPERTIES_BEAN_NAME, getEnvironment().getSystemProperties());
        }
        // systemEnvironment
        if (!beanFactory.containsLocalBean(SYSTEM_ENVIRONMENT_BEAN_NAME)) {
            beanFactory.registerSingleton(SYSTEM_ENVIRONMENT_BEAN_NAME, getEnvironment().getSystemEnvironment());
        }
        // applicationStartup
        if (!beanFactory.containsLocalBean(APPLICATION_STARTUP_BEAN_NAME)) {
            beanFactory.registerSingleton(APPLICATION_STARTUP_BEAN_NAME, getApplicationStartup());
        }
    }

注意到上面要麼是設定 BeanFactory 屬性,要麼是注入單例 Bean

3. 注入的 Bean

  1. StandardBeanExpressionResolver
    SpEL 解析器。

  2. ResourceEditorRegistrar
    屬性編輯器。咱不知道作用。

  3. ApplicationContextAwareProcessor
    繼承 BeanPostProcessor,參與 Bean 的例項化過程。
    當 Bean 繼承了一些 Aware 介面時,回撥這個介面,注入相應的 Bean。
    支援的 Aware 介面

if (!(bean instanceof EnvironmentAware || bean instanceof EmbeddedValueResolverAware ||
        bean instanceof ResourceLoaderAware || bean instanceof ApplicationEventPublisherAware ||
        bean instanceof MessageSourceAware || bean instanceof ApplicationContextAware ||
        bean instanceof ApplicationStartupAware)) {
    return bean;
}
  1. ApplicationListenerDetector
    繼承 BeanPostProcessor,參與 Bean 的例項化過程。
    暫時不知道作用,暫略。

  2. 一些內部 Bean
    Environment 例項、Map 型別的 systemProperties、Map 型別的 systemEnvironment
    ApplicationStartup 例項,暫不知道作用。