文档章节

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

 叶琎宇
发布于 2017/04/08 11:16
字数 1154
阅读 101
收藏 0
点赞 0
评论 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

OpenVPN 原理与实战文章汇总

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

陈明乾 ⋅ 2014/01/25 ⋅ 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

关于OpenVPN文章的目录

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

晨曦之光 ⋅ 2012/04/10 ⋅ 0

基于fiddler插件开发的移动测试网络监控与分析

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

百度MTC ⋅ 2015/12/18 ⋅ 0

架构师必备词汇和知识点

01 高可用 负载均衡(负载均衡算法) 反向代理 服务隔离 服务限流 服务降级(自动优雅降级) 失效转移 超时重试(代理超时、容器超时、前端超时、中间件超时、数据库超时、NoSql超时) 回滚机...

t4i2b10X4c22nF6A ⋅ 2017/11/24 ⋅ 0

Spring Boot揭秘与实战

Spring Boot 揭秘与实战(九) 应用监控篇 - HTTP 应用监控 Spring Boot 提供运行时的应用监控和管理功能。本文,我们通过 HTTP 实现对应用的监控和管理。 博客地址:http://blog.720ui.com...

掘金官方 ⋅ 2017/12/11 ⋅ 0

后台开发常问面试题集锦(问题搬运工,附链接)

Java基础问题 String的’+’的性能及原理 java之yield(),sleep(),wait()区别详解-备忘笔记 深入理解Java Stream流水线 抽象 & abstract关键字 Java final 修饰符知识点总结(必看篇) Java中的...

大黄有故事 ⋅ 2017/11/18 ⋅ 0

SDN 技术指南(四):Open vSwitch

摘要 Open vSwitch 安装 Open vSwitch 命令行 Open vSwitch 运行原理 Open vSwitch 性能监控 前言 由之前发布的文章知道 Open vSwitch(Open Source Virtual Switch) 是一款基于软件实现的开源...

RiboseYim ⋅ 2017/10/16 ⋅ 0

2015-2016前端体系技术图谱

2015-2016前端架构体系技术 进入github查看大图 点击查看完整版 一、框架与组件  **bootstrap等UI框架设计与实现 伸缩布局:grid网格布局 基础UI样式:元素reset、按钮、图片、菜单、表单 ...

ouven ⋅ 2016/01/26 ⋅ 43

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Java NIO之字符集

1 字符集和编解码的概念 首先,解释一下什么是字符集。顾名思义,就是字符的集合。它的初衷是把现实世界的符号映射为计算机可以理解的字节。比如我创造一个字符集,叫做sex字符集,就包含两个...

士别三日 ⋅ 29分钟前 ⋅ 0

Spring Bean基础

1、Bean之间引用 <!--如果Bean配置在同一个XML文件中,使用local引用--><ref bean="someBean"/><!--如果Bean配置在不同的XML文件中,使用ref引用--><ref local="someBean"/> 其实两种......

霍淇滨 ⋅ 34分钟前 ⋅ 0

05、基于Consul+Upsync+Nginx实现动态负载均衡

1、Consul环境搭建 下载consul_0.7.5_linux_amd64.zip到/usr/local/src目录 cd /usr/local/srcwget https://releases.hashicorp.com/consul/0.7.5/consul_0.7.5_linux_amd64.zip 解压consu......

北岩 ⋅ 37分钟前 ⋅ 0

Webpack 4 api 了解与使用

webpack 最近升级到了 v4.5+版 01 官方不再支持 node4 以下版本 官方不再支持 node4 以下版本官方不再支持 node4 以下的版本,所以如果你的node版本太低,先开始升级node吧!话说node10 ...

NDweb ⋅ 47分钟前 ⋅ 0

使用nodeJs安装Vue-cli

Vue脚手架就是一个Vue框架开发环境 脚手架的意思是帮你快速开始一个vue的项目,也就是给你一套vue的结构,包含基础的依赖库,只需要 npm install就可以安装,让我们不需要为了编辑或者一些其...

木筏笔歆 ⋅ 今天 ⋅ 0

【微信小程序开发实战】0x00.开发前准备工作

写在开始 本人资深后端码农一枚,近期项目需求,接触到了微信小程序,将学习过程整理成文分享给小伙伴们,由于是边学边整理难免有表述不对的地方,望大家及时指正,感谢。 本人微信号: dream...

dreamans ⋅ 今天 ⋅ 0

linux redis的安装和php7下安装redis扩展

安装redis服务器 (1)下载安装包: $ wget http://download.redis.io/releases/redis-2.8.17.tar.gz (2)编译程序: $ tar xzf redis-2.8.17.tar.gz $ cd redis-2.8.17 $ make $ cd src &&......

concat ⋅ 今天 ⋅ 0

Guava EventBus源码解析

一、EventBus使用场景示例 Guava EventBus是事件发布/订阅框架,采用观察者模式,通过解耦发布者和订阅者简化事件(消息)的传递。这有点像简化版的MQ,除去了Broker,由EventBus托管了订阅&...

SaintTinyBoy ⋅ 今天 ⋅ 0

http怎么做自动跳转https

Apache 版本 如果需要整站跳转,则在网站的配置文件的<Directory>标签内,键入以下内容: RewriteEngine on RewriteCond %{SERVER_PORT} !^443$ RewriteRule ^(.*)?$ https://%{SERVER_NAME......

Helios51 ⋅ 今天 ⋅ 0

Python爬虫,抓取淘宝商品评论内容

作为一个资深吃货,网购各种零食是很频繁的,但是能否在浩瀚的商品库中找到合适的东西,就只能参考评论了!今天给大家分享用python做个抓取淘宝商品评论的小爬虫! 思路 我们就拿“德州扒鸡”...

python玩家 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部