Spring原始碼閱讀 - prepareBeanFactory
阿新 • • 發佈:2022-04-08
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
-
StandardBeanExpressionResolver
SpEL 解析器。 -
ResourceEditorRegistrar
屬性編輯器。咱不知道作用。 -
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; }
-
ApplicationListenerDetector
繼承 BeanPostProcessor,參與 Bean 的例項化過程。
暫時不知道作用,暫略。 -
一些內部 Bean
Environment 例項、Map 型別的 systemProperties、Map 型別的 systemEnvironment
ApplicationStartup 例項,暫不知道作用。