文档章节

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

 叶琎宇
发布于 2017/04/08 11:16
字数 1154
阅读 127
收藏 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
宁波
高级程序员
私信 提问
Spring3.1.0 能匹配quartz2.2.1吗

Spring3.1.0 能匹配quartz2.2.1吗

demoadmin
2015/05/22
32
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文章目录汇总

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

815632410
2015/01/12
0
0
Ocelot简易教程(七)之配置文件数据库存储插件源码解析

作者:依乐祝 原文地址:https://www.cnblogs.com/yilezhu/p/9852711.html 上篇文章给大家分享了如何集成我写的一个Ocelot扩展插件把Ocelot的配置存储到数据库中。并没有对实现原理进行相应的...

依乐祝
10/25
0
0

没有更多内容

加载失败,请刷新页面

加载更多

nginx的内容

1、nginx 稳定,由俄国人开发, nginx.org 分支: tengine,由淘宝开发; tengine.taobao.com nginx的功能:http服务, 负载均衡 反向代理 邮件代理 缓存加速 SSL, 功能完善;高并发 可以用来处理...

芬野de博客
21分钟前
0
0
websocket 接口简单测试工具,webcoket实用测试工具

chorme 插件 Simple WebSocket Client 对开发来说够用了,能连互联网,也能连本地的。 之前用jmeter 带复杂了,而且登录不好弄,这个基于浏览器,共享浏览器的登录信息。方便!...

SimonAt
27分钟前
3
0
Ext中 get、getDom、getCmp的区别

getDom方法能够得到文档中的DOM节点,该方法中包含一个参数,该参数可以是DOM节点的id、DOM节点对象或DOM节点对应的Ext元素(Element)等。 (与getElementById是一个效果) •Ext.onReady(funct...

休辞醉倒
34分钟前
1
0
springboot jpa 访问数据库

spring boot(五):spring data jpa的使用 SpringBoot非官方教程 | 第三篇:SpringBoot用JdbcTemplates访问Mysql

颖辉小居
49分钟前
4
0
Quartz + Oracle 分布式Job实现

简述 实现 依赖包 <dependency><groupId>org.quartz-scheduler</groupId><artifactId>quartz</artifactId><version>2.2.3</version><exclusions><exclusion><groupId>com.zax......

呼呼南风
55分钟前
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部