在此之前已经完成了IOC对xml的解析和实例化工作,接下来需要分析Spring的高级版本对IOC容器的功能扩展:

代码分析如下:

synchronized (this.startupShutdownMonitor) {// 准备刷新上下文环境prepareRefresh();// 初始化BeanFactory,并进行XML文件的读取 之前大部分IOC的核心逻辑都在这里ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();//对BeanFactory进行各种功能填充prepareBeanFactory(beanFactory);try {// 留给子类进行服务覆盖和扩展的方法.postProcessBeanFactory(beanFactory);//激活各种BeanFactory处理器.invokeBeanFactoryPostProcessors(beanFactory);//激活Bean后处理器,在getBean时候调用,而BeanFactory后处理器是容器级别的,在此时就会被调用.registerBeanPostProcessors(beanFactory);//资源国际化处理.initMessageSource();// 初始化广播器,用于放所有的bean的监听器,并放入BeanFactory属性applicationEventMulticaster中.initApplicationEventMulticaster();// 留给子类去初始化其他bean,目前方法为空.onRefresh();// 查找bean的所有的监听器,并注册到广播器中去.registerListeners();// 初始化剩下的单实例.finishBeanFactoryInitialization(beanFactory);// 完成刷新过程,通知生命周期.finishRefresh();}

  

接下来,即开始对上面的步奏进行一一的讲解:

prepareRefresh();// 准备刷新上下文环境

protected void prepareRefresh() {//留给子类覆盖的方法
        initPropertySources();// Validate that all properties marked as required are resolvable// 验证所需的属性已经存放到环境中
        getEnvironment().validateRequiredProperties();// Allow for the collection of early ApplicationEvents,// to be published once the multicaster is available...this.earlyApplicationEvents = new LinkedHashSet<ApplicationEvent>();}

下面举一个列子,来帮助理解,如何验证所需的属性已经存放到环境中

public class MyClassPathXmlApplicationContext extends ClassPathXmlApplicationContext{public MyClassPathXmlApplicationContext(String... configLocations) throws BeansException {super(configLocations);}protected void initPropertySources(){// 在这里设置需要检测的环境变量 VARgetEnvironment().setRequiredProperties("VAR");}protected void customizeBeanFactory(DefaultListableBeanFactory beanFactory){super.setAllowCircularReferences(false);super.setAllowBeanDefinitionOverriding(false);super.customizeBeanFactory(beanFactory);}
}

  

我们在使用MyClassPathXmlApplicationContext 对象加载bean的时候就会进行环境变量的验证

在使用ApplicationContext ctx = new MyClassPathXmlApplicationContext("spring.xml");的时候,如果环境变量中没有怎加VAR,就会报错,抛出异常。

转载于:https://www.cnblogs.com/histlyb/p/9179492.html

spring IOC容器的扩展相关推荐

  1. Spring —— IoC 容器详解

    引言 本篇博客总结自官网的<The IoC Container>,其中会结合王富强老师的<Spring揭秘>融入自己的语言和理解,争取通过这一篇文章彻底扫除spring IOC ...

  2. 用项目案例彻底理解Spring IOC容器

    本篇介绍Spring IOC容器,通过具体的实例详细地讲解IOC概念,彻底理解Spring反转控制的思想.通过本篇的学习,可以达成如下目标. ● 运用工厂模式设计程序 ● 理解JavaBean和POJ ...

  3. Spring – IoC 容器

    Spring IoC 容器是 Spring 框架的核心.容器将创建对象,将它们连接在一起,进行配置,并管理从创建到销毁的整个生命周期.Spring 容器使用依赖项注入(DI)来管理组成应用程序的组件. ...

  4. 面试官:你来说一下Spring IOC容器的创建过程

    这篇文章主要讲解 IOC 容器的创建过程,让你对整体有一个全局的认识,文章没有复杂嵌套的 debug 流程,相对来说比较简单. 不 BB,上文章目录. 1. 基础知识 1.1 什么是 Spring I ...

  5. Spring IOC容器学习总结

    1. Spring Ioc容器 Spring容器是Spring框架的核心.容器将创建对象,把它们连接在一起,配置它们,并管理他们的整个生命周期从创建到销毁.Spring 容器使用依赖注入(DI)来管理 ...

  6. 什么是Spring IoC容器?

    1 什么是Spring IoC容器 Spring IoC负责创建对象.管理对象(通过依赖注入(DI).装配对象.配置对象,并且管理这些对象的整个生命周期. 2 IoC的优点是什么 IoC或依赖注入把应 ...

  7. spring ioc容器创建过程-整体流程

    文章目录 一.spring ioc 创建总览 二.BeanFactory和ApplicationContext 三.初始化DefaultListableBeanFactory 四.总结: 前面写了四篇 ...

  8. Spring IOC 容器源码分析

    Spring IOC 容器源码分析 创建时间: 2017-11-15 00:00:00 [TOC] Spring 最重要的概念是 IOC 和 AOP,本篇文章其实就是要带领大家来分析下 Spring ...

  9. Spring IOC容器生命周期阶段总结

    Spring IOC容器生命周期 BeanFactory和ApplicationContext有何区别? 源码展示 1. Spring应用上下文启动准备阶段 2. BeanFactory创建阶段 3. ...

最新文章

  1. python中args1是什么意思_理解Python中的*,*args
  2. 怎么用php操作mysql删除数据库代码_如何使用php操作mysql的增删改查?
  3. 用EXCEL实现时间戳格式和日期格互转
  4. mysql1130_解决远程连接mysql错误1130的方法
  5. 论文阅读:超高分辨率图像中快速、准确的条码检测
  6. 基于C#net4.5websocket客户端与服务端
  7. ASP.NET输入文本框自动提示功能
  8. 2010年imac从移动硬盘启动Win10
  9. C++ 函数需要有返回值,但非全分支return(RVO)
  10. Android周日历可滑动可选择日期
  11. 爬虫实战---爬取猫眼电影
  12. 计算机使用hdmi需要设置方法,如何在计算机显示器上切换HDMI
  13. 冬天 计算机无法启动不了怎么办,每次到冬天电脑就开不了
  14. UE4 无需切线空间应用凹凸贴图
  15. CF Canada Cup 2016 D 优先队列
  16. html5制作线路图,HTML5画一个简单呢好看的电路图
  17. RVDS4.0 破解
  18. 2021年的Gartner云基础设施和平台服务魔力象限有什么不一样?
  19. 知行EDI系统如何通过中间数据库表方式集成金蝶ERP
  20. vue移动端富文本编辑器vue-html5-editor

热门文章

  1. 人和人之间是需要沟通的
  2. 发送邮件代码--ASP.NET中常用代码之一
  3. 三菱触摸屏通讯错误_三菱触摸屏常见问题及故障汇总
  4. JS window对象常用方法
  5. Python一些特殊用法(map、reduce、filter、lambda、列表推导式等)
  6. MySQL第1天:整体目录
  7. 得到CRC16校验码的常见几个标准的算法及C语言实现
  8. 一个标准的PID算法
  9. java web六:tomcat其他小问题
  10. 大公司的前端开发地址