前言

根据 refresh 流程,当 obtainFreshBeanFactory 执行结束后,下一步会执行 prepareBeanFactory ,顾名思义,这个方法主要是准备 BeanFactory,下面一起看一看这部分逻辑。

prepareBeanFactory

  1. protected void prepareBeanFactory(ConfigurableListableBeanFactory beanFactory) {
  2. // Tell the internal bean factory to use the context's class loader etc.
  3. // 设置beanFactory的类加载器
  4. beanFactory.setBeanClassLoader(getClassLoader());
  5. // spring.spel.ignore 属性控制是否解析 SpEL 表达式
  6. if (!shouldIgnoreSpel) {
  7. beanFactory.setBeanExpressionResolver(new StandardBeanExpressionResolver(beanFactory.getBeanClassLoader()));
  8. }
  9. // 设置属性解析器
  10. beanFactory.addPropertyEditorRegistrar(new ResourceEditorRegistrar(this, getEnvironment()));
  11. // Configure the bean factory with context callbacks.
  12. // 添加到后置处理器列表, 新创建的 ApplicationContextAwareProcessor 入参为当前 ApplicationContext
  13. beanFactory.addBeanPostProcessor(new ApplicationContextAwareProcessor(this));
  14. // 忽略自动装配
  15. // 默认情况下 只有BeanFactoryAware 被忽略 要忽略其他类型,需要单独设置
  16. beanFactory.ignoreDependencyInterface(EnvironmentAware.class);
  17. beanFactory.ignoreDependencyInterface(EmbeddedValueResolverAware.class);
  18. beanFactory.ignoreDependencyInterface(ResourceLoaderAware.class);
  19. beanFactory.ignoreDependencyInterface(ApplicationEventPublisherAware.class);
  20. beanFactory.ignoreDependencyInterface(MessageSourceAware.class);
  21. beanFactory.ignoreDependencyInterface(ApplicationContextAware.class);
  22. beanFactory.ignoreDependencyInterface(ApplicationStartup.class);
  23. // BeanFactory interface not registered as resolvable type in a plain factory.
  24. // MessageSource registered (and found for autowiring) as a bean.
  25. // 注册自动装配的类
  26. beanFactory.registerResolvableDependency(BeanFactory.class, beanFactory);
  27. beanFactory.registerResolvableDependency(ResourceLoader.class, this);
  28. beanFactory.registerResolvableDependency(ApplicationEventPublisher.class, this);
  29. beanFactory.registerResolvableDependency(ApplicationContext.class, this);
  30. // Register early post-processor for detecting inner beans as ApplicationListeners.
  31. beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(this));
  32. // Detect a LoadTimeWeaver and prepare for weaving, if found.
  33. // 是否需要类加载期间织入 增加Aspectj的支持
  34. if (!IN_NATIVE_IMAGE && beanFactory.containsBean(LOAD_TIME_WEAVER_BEAN_NAME)) {
  35. beanFactory.addBeanPostProcessor(new LoadTimeWeaverAwareProcessor(beanFactory));
  36. // Set a temporary ClassLoader for type matching.
  37. beanFactory.setTempClassLoader(new ContextTypeMatchClassLoader(beanFactory.getBeanClassLoader()));
  38. }
  39. // Register default environment beans.
  40. // 注册其他的 bean
  41. if (!beanFactory.containsLocalBean(ENVIRONMENT_BEAN_NAME)) {
  42. beanFactory.registerSingleton(ENVIRONMENT_BEAN_NAME, getEnvironment());
  43. }
  44. if (!beanFactory.containsLocalBean(SYSTEM_PROPERTIES_BEAN_NAME)) {
  45. beanFactory.registerSingleton(SYSTEM_PROPERTIES_BEAN_NAME, getEnvironment().getSystemProperties());
  46. }
  47. if (!beanFactory.containsLocalBean(SYSTEM_ENVIRONMENT_BEAN_NAME)) {
  48. beanFactory.registerSingleton(SYSTEM_ENVIRONMENT_BEAN_NAME, getEnvironment().getSystemEnvironment());
  49. }
  50. if (!beanFactory.containsLocalBean(APPLICATION_STARTUP_BEAN_NAME)) {
  51. beanFactory.registerSingleton(APPLICATION_STARTUP_BEAN_NAME, getApplicationStartup());
  52. }
  53. }

这块代码比较长,但是逻辑比较简单,就直接贴代码了。
再对代码进行分析,主要经历以下几个阶段:

  1. addBeanPostProcessor 添加 BeanPostProcessor
  2. registerResolvableDependency 注册依赖关系
  3. registerSingleton 注册其他的单例 Bean

下面可以 Debug 看一下。

Debug

方法调用前:
10-Spring prepareBeanFactory - 图1
registerResolvableDependency 执行之后
10-Spring prepareBeanFactory - 图2
这里发现调用 registerResolvableDependency 执行结束之后,beanDefinitionNames 中并没有多添加相关对象。
查看源码发现其实是添加到了 resolvableDependencies 这个 Map 中了。
10-Spring prepareBeanFactory - 图3

回顾 在介绍 DefaultListableBeanFactory 时,说 BeanDefinition 是存储在 beanDefinitionMap 中的。 而这里的依赖关系是则是存储在 resolvableDependencies 中的。

postProcessBeanFactory

在执行 prepareBeanFactory 之后,当看到 postProcessBeanFactory(beanFactory); 方法的时候就很疑惑, 因为这个是需要子类实现的,只是作为一个模板方法,子类实现之后,可以在里面添加自己的逻辑。

总结

这篇文章相对比较简单,就是准备 BeanFactory 向其中添加系统的依赖以及 bean, 而 postProcessBeanFactory 则是一个模版方法用来供子类实现。
10-Spring prepareBeanFactory - 图4

相关推荐