容器已经创建完成,接下来 执行prepareBeanFactory(),对BeanFactory做一些设置与准备工作。(之前的执行流程可在本系列博客中看到)

容器refresh 总览:

     synchronized (this.startupShutdownMonitor) {// 设置环境,校验参数。prepareRefresh();// 创建BeanFactory(DefaultListableBeanFactor),加载bean定义信息。ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();// 对BeanFactory设置prepareBeanFactory(beanFactory);try {// Allows post-processing of the bean factory in context subclasses.postProcessBeanFactory(beanFactory);// Invoke factory processors registered as beans in the context.invokeBeanFactoryPostProcessors(beanFactory);// Register bean processors that intercept bean creation.registerBeanPostProcessors(beanFactory);// Initialize message source for this context.initMessageSource();// Initialize event multicaster for this context.initApplicationEventMulticaster();// Initialize other special beans in specific context subclasses.onRefresh();// Check for listener beans and register them.registerListeners();// Instantiate all remaining (non-lazy-init) singletons.finishBeanFactoryInitialization(beanFactory);// Last step: publish corresponding event.finishRefresh();}catch (BeansException ex) {if (logger.isWarnEnabled()) {logger.warn("Exception encountered during context initialization - " +"cancelling refresh attempt: " + ex);}// Destroy already created singletons to avoid dangling resources.destroyBeans();// Reset 'active' flag.cancelRefresh(ex);// Propagate exception to caller.throw ex;}finally {// Reset common introspection caches in Spring's core, since we// might not ever need metadata for singleton beans anymore...resetCommonCaches();}}

prepareBeanFactory

 protected void prepareBeanFactory(ConfigurableListableBeanFactory beanFactory) {// 设置类加载器beanFactory.setBeanClassLoader(getClassLoader());// 设置Spel解析器beanFactory.setBeanExpressionResolver(new StandardBeanExpressionResolver(beanFactory.getBeanClassLoader()));// 设置转换器,完成xml中字符到其他类型的转换beanFactory.addPropertyEditorRegistrar(new ResourceEditorRegistrar(this, getEnvironment()));// 设置一个beanPostProcessor 完成一系列 XXXAware接口的注入,就是在bean初始化前,从beanFactory中获取XXXAware进行诸如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中,注册添加这些类,这些类可以通过工厂获取,可以被依赖注入beanFactory.registerResolvableDependency(BeanFactory.class, beanFactory);beanFactory.registerResolvableDependency(ResourceLoader.class, this);beanFactory.registerResolvableDependency(ApplicationEventPublisher.class, this);beanFactory.registerResolvableDependency(ApplicationContext.class, this);// 设置一个beanPostProcessor,在bean初始化后,如果它是一个ApplicationListener 完成ApplicationListener的bean的注册beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(this));// LoadTimeWeaver是一种代理技术,具体参考 https://www.cnblogs.com/wade-luffy/p/6073702.htmlif (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()));}// 如果beanFactory没有包含environment,systemProperties 等,注册添加一下。if (!beanFactory.containsLocalBean(ENVIRONMENT_BEAN_NAME)) {beanFactory.registerSingleton(ENVIRONMENT_BEAN_NAME, getEnvironment());}if (!beanFactory.containsLocalBean(SYSTEM_PROPERTIES_BEAN_NAME)) {beanFactory.registerSingleton(SYSTEM_PROPERTIES_BEAN_NAME, getEnvironment().getSystemProperties());}if (!beanFactory.containsLocalBean(SYSTEM_ENVIRONMENT_BEAN_NAME)) {beanFactory.registerSingleton(SYSTEM_ENVIRONMENT_BEAN_NAME, getEnvironment().getSystemEnvironment());}}

Spring容器创建流程(3)对beanFactory设置相关推荐

  1. Spring容器创建流程——总结

    spring容器创建的主要流程在他的refresh()方法中,接下来就开始总结一个下他的refresh()方法中的每个步骤大概都做了那些事情.refresh() 可在AbstractApplicati ...

  2. Spring容器创建流程(1)容器创建准备

    本系列文章将逐一介绍,Spring容器创建到容器刷新完成每个过程. Spring容器继承结构图 第一步,new容器实例 ApplicationContext factory = new ClassPa ...

  3. Spring容器创建流程(4)调用beanFactory后置处理器

    postProcessBeanFactory() 方法留给子类去实现. invokeBeanFactoryPostProcessors() 调用bean工厂的后置处理器(以前的执行流程可在系列文章中查 ...

  4. Spring容器创建流程(2)创建beanFactory,加载BeanDefinition

    Spring 容器的创建.obtainFreshBeanFactorr()中完成容器的创建.(BeanFactory关系类图,之前的执行流程可在本系列博客中看到).接下来看容器创建的第二部,创建bea ...

  5. spring系列-注解驱动原理及源码-spring容器创建流程

    目录 一.spring容器的refresh()[创建刷新] 二.BeanFactory 的创建及预准备工作 1.prepareRefresh()刷新前预处理工作. 2.obtainFreshBeanF ...

  6. Spring容器创建流程(8)初始化bean

    finishBeanFactoryInitialization(beanFactory); 很重要的一步,初始化剩余未初始化的bean(还没有创建实例放到容器中的). 容器refresh总览: syn ...

  7. Spring容器创建流程(5)bean后置处理之注册

    registerBeanPostProcessors 注册bean的后置处理器(以前的执行流程可在系列文章中查看),注意 beanFactoryPostProcessor 是 bean工厂的后置处理器 ...

  8. Spring容器创建流程(9)完成创建

    Spring的refresh() 方法中finishRefresh()方法完成之后也就代表着,Spring容器真正的创建完成了.下面看finishRefresh()的源码. 容器refresh总览: ...

  9. Spring容器创建流程(7)事件派发机制

    Spring事件驱动,监听机制.由三步分组成,事件,派发器,监听器. 事件: spring事件的顶级父类是EventObject,通常情况下继承ApplicationEvent 自定义自己的事件. 事 ...

最新文章

  1. object-c全局变量
  2. android自动化优化工具,一键自动优化系统大师下载
  3. Python+OpenCV 平移、旋转、缩放、翻转
  4. 数据集增广 之 多个图片贴到一张图上,以及生成相应的json文件
  5. Xcode8注释有时会失效的解决方法
  6. mac下日期、时间戳互转
  7. 图论--最短路--SPFA模板(能过题,真没错的模板)
  8. 与 OpenCV 1 同时使用
  9. 程序员锁死公司服务器,导致600万元资金打水漂。网友神回复
  10. WinDbg 入门教程
  11. oracle 同义词循环连,Oracle出现ORA-01775: 同义词的循环链问题
  12. 克服J2SE 1.3 ~ 1.4不兼容问题
  13. 百度在线语音合成API接口简单应用
  14. python立体爱心_css绘制各种各样的形状图形
  15. 2019年互联网公司月饼颜值大比拼!
  16. 中文分词多领域语料库
  17. sql trace基础
  18. VIM:消除~ 和 .un~后缀的备份文件
  19. T12焊台和JBC焊台自制资料(原理和电路)
  20. 校园二手交易平台课程设计正文

热门文章

  1. iphone导出照片到电脑_假期即将结束,手机照片需要备份了!比 iTunes 更好用!...
  2. 用Python实现跳一跳自动跳跃。
  3. Mac中Python版本随意切换终极指南,简单到爆,什么都不用设置
  4. sdcv: 在Ubuntu中使用命令行查询离线英文词典
  5. PowerBI Report Server 自定义视图无法显示故障解决
  6. DataGrid使用心得(附大量代码)
  7. 身份云平台 Authing 完成 2300 万美元 A 轮融资 老虎环球基金领投
  8. 蔚来事故启示录:被夸大的和被误导的自动驾驶
  9. iPhone 12蓝色版疑似翻车:眼前的蓝不是蓝......
  10. 刘海、水滴、挖孔都靠边!中兴吐槽:不配全面屏