文档章节

Spring3.1.0实现原理分析(三).配置数据

 叶琎宇
发布于 2017/04/08 11:16
字数 1154
阅读 109
收藏 0

      今天我想谈一下,Spring从哪里获取配置数据? 配置数据做什么用处? 如何存储和访问配置数据?就像一辆汽车,开之前总得先加油吧,不然何如工作呢。

1.  配置数据有哪些,何时加载,其作用是什么。

       我觉得Spring的数据源至少可分为两类,JDK系统数据和用户配置数据。jdk系统数据具体是指System#getProperties()方法返回值和System#getenv()方法返回值。用户配置数据其一是使用<context:property-placeholder location="..." />指定的资源文件,最常见的场景就是在这个资源文件中配置数据库的用户名、密码等。用户配置数据还包括定义bean的资源文件,在Spring的初始化过程中会解析资源文件获取Bean定义对象注册到Bean工厂中。

       JDK系统配置数据是先于用户配置数据加载的,在ApplicationContext的构造函数中即被加载,如此早加载是因为可用它来解析用户指定的资源文件路径中可能存在的占位符。Bean定义资源文件而后加载,最后在容器后处理器中加载<context:property-placeholder location=""/>指定的资源文件,然后使用它来解析Bean定义中的占位符,比如你可能在Bean定义中使用${jdcb.uername}这个表达式代表数据库用户名。也就是说在实例化Bean对象前,Bean定义中的占位符已经被替换成实际值,但是Bean定义中的Spel表达式尚未被解析。

2.  如何加载、存储和访问JDK系统配置数据

       Spring所有的一切是从创建ApplicationContext(以下简称AC)开始的,而AC的构造函数中第一个步骤是创建“基于路径匹配的资源模式解析器”,这个类的作用是加载资源文件;第二个步骤就是创建“标准环境对象”。   

       在标准环境对象的构造函数中,它会调用JDK系统方法System#getProperties()和System#getenv(),两者的返回值分别是“Properties”和“ Map<String,String>”,是两种不同类型的对象。为了使用统一的方式访问它们,Spring会把它们包装成属性源对象(PropertySource),然后添加到自身持有的属性源集对象(PropertySources)中,再通过属性解析器对象(PropertyResolver)访问属性源对象。三者之间的关系可以用下图来表述,

  

       标准环境对象还有几个派生类,如标准Servlet环境对象(StandardServletEnvironment),这个类在超类把System#getProperties()和System#getenv()转换成属性源对象的基础上,还会把ServletConfig#servletConfigInitParams()和servletConfig#servletContextInitParams()包装成属性源对象。这里有个很有意思的处理方式,标准Servlet环境对象并没有获取真正的servletConfigInitParams和servletContextInitParams,仅仅只是两个存根属性源对象,然后由抽象可刷新Web容器把存根替换成真实对象,大概是为了避免标准Servlet环境对象对Web对象有依赖。

3.  如何加载用户配置数据

     如果用户在Spring配置文件中使用<context:property-placeholder location="..." />指定了资源文件路径的话,Spring会自动注册一个容器后处理器,在3.1版本中这个类是“PropertySourcesPlaceholderConfigurer”,该对象持有标准环境对象,处理具体步骤如下:

a. 首先加载用户配置的资源文件,通过资源加载器(ResourceLoader)实现该功能,上面也说到过,AC构造函数函数中的第一步就是创建资源加载器, 通过它把资源文件转换成资源对象(Resource),然后把资源对象转换成属性集对象(java系统类),再把属性集合对象包装成属性源对象(PropertySource)。

b. 合并标准环境对象的属性源对象和用户配置数据的属性源对象,默认用户配置属性源对象优先级高。

c. 创建解析器,解析bean定义中的占位符。 

 

好了,先写到这里。之所以讨论配置数据,是因为想搞清楚驱动Spring工作的能源是从哪来的,分别是哪些能源。

总结,能源有两部分,一部分是系统环境的,一部分是用户配置的,Spring会把所有的能源包装成属性源对象,然后通过属性解析器获取其中数据。

© 著作权归作者所有

共有 人打赏支持
粉丝 4
博文 25
码字总数 36889
作品 0
宁波
高级程序员
Linux日志分析系统Awstat分析nignx日志

一.简述 AWStats 软件是一个免费的强大的基于Perl的WEB日志分析工具,显示你所有的网页/邮件/ FTP统计包括访问,访问者,页面,点击,高峰时间,操作系统,浏览器,搜索引擎,关键字,机器人...

lqbyz
2017/09/18
0
0
Open*** 原理与实战文章汇总

概述: 1.Open* 开源软件,首先要感谢Open*团队。 2.在网上找了些关于Open*文章发现在大部分都在讲配置,很少有人写原理的。在CSDN上一位大神,写了很多关于Open原理、数据包分析的文章,在这...

陈明乾
07/02
0
0
关于OpenVPN文章的目录

本文对前面的关于OpenVPN的文章做一个总结,分了几个类别,也方便自己以后查阅和更正。 一.基本理论篇 1. vpn原理及实现--一般理论 2. vpn原理及实现--隧道的一种实现 3. vpn原理及实现--虚拟...

晨曦之光
2012/04/10
497
0
OpenVPN文章目录汇总

谢谢 博友汇总 ljl603 http://ljl2013.blog.51cto.com/186072/1388648 同时谢谢原创作者的辛勤的总结 http://blog.csdn.net/dog250/article/details/6990814 一.基本理论篇 1. vpn原理及实现...

815632410
2015/01/12
0
0
基于fiddler插件开发的移动测试网络监控与分析

一、背景和目的: 由于目前App前端业务测试很少关注后端网络接口的异常情况,客户端QA在项目测试时往往局限于关注测试功能,导致测试粒度较粗。即使按照CheckList过功能点,客户端QA对后端接...

百度MTC
2015/12/18
83
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

java并发备忘

不安全的“先检查后执行”,代码形式如下: if(条件满足){ //这里容易出现线程安全问题//doSomething}else{//doOther} 读取-修改-写入 原子操作:使用CAS技术,即首先从V中读取...

Funcy1122
今天
0
0
SpringBoot2.0 停机

最近新建了个SpringBoot2.0的项目,因为原来一直使用的是传统的Tomcat部署war包的形式,所以这次SpringBoot内置Tomcat部署jar包的时候遇到了很多问题。其中一个就是因为没有外置的Tomcat容器...

Canaan_
昨天
0
1
Confluence 6 外部参考

一个外部参考的意思是任何站点链接到你 Confluence 的实例。任何时候当 Confluence 的用户单击这个外部链接的时候,Confluence 可以记录这次单击为参考。 在默认的情况下,外部链接的参考链接...

honeymose
昨天
0
0
Android中的设计模式之抽象工厂模式

参考 《设计模式解析》 第十一章 Abstract Factory模式 《设计模式:可复用面向对象软件的基础 》3.1 Abstract Factory 抽象工厂 对象创建型模式 《Android源码设计模式解析与实战》第6章 创...

newtrek
昨天
0
0
Redis | 地理空间(GEO)的一个坑

Redis的地理空间(Geo)是个好东西,轻轻松松的就可以把地图描点的问题处理了, 最近却遇到一个坑...Redis采用的Msater-Slave模式, 运用GEORADIUS在salve读取对应的数据,新增了从节点但是从不返...

云迹
昨天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部