热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Spring核心——资源数据管理

为什么80%的码农都做不了架构师?在Profile管理环境一文中介绍了环境的概念以及SpringProfile特性控制Bean的添加。本文将进一步介绍Sprin

为什么80%的码农都做不了架构师?>>>   hot3.png

在Profile管理环境一文中介绍了环境的概念以及Spring Profile特性控制Bean的添加。本文将进一步介绍Spring管理和控制操作系统变量、JVM变量和Java标准资源(properties文件)的相关功能。

文章的代码仅仅用于说明问题,可执行代码请到我的gitee库clone,本文的代码在chkui.springcore.example.hybrid.propertsource包中。

PropertySource与优先级

在整个Jvm运行期间,我们可以随时随地获取到2个与环境相关的参数:

package chkui.springcore.example.hybrid.propertsource;//env是与操作系统相关的参数
Map env = System.getenv();
//properties中是Jvm相关的参数
Properties p = System.getProperties();
System.out.println("env :" + env);
System.out.println("properties :" + p);

如果没有人为的添加额外信息,System::getEnv获取的数据都与当前的操作系统相关(以下称为“操作系统参数”),而System::getProperties获取的内容都与Jvm相关(以下称为“JVM参数”)。

Spring会将操作系统参数和Jvm参数都整合到自己的环境管理接口Environment中,例如下面的代码:

package chkui.springcore.example.hybrid.propertsource;//向系统级的properties设置一个参数
System.setProperty("wow", "World of Warcraft");
ApplicationContext ctx = new AnnotationConfigApplicationContext(PropertySourcesApp.class);
//通过spring的Environment获取参数
Environment springEnv = ctx.getEnvironment();
System.out.println(springEnv.getProperty("wow"));
System.out.println(springEnv.getProperty("PATH"));

除了我们自定义的"wow",操作系统参数"PATH"也可以在Spring的Environment中获取。

通常情况下,在Environment内部维护了2个PropertySources的实例:一个是操作系统参数,另外一个是JVM参数。如果2者有同样的参数,那么我们在调用Environment::getProperty方法时,得到的是JVM参数(System::getProperties),也就是说 Jvm参数具有更高的优先级。

除了通过外部设置,我们也可以直接使用Spring提供的接口来设置:

package chkui.springcore.example.hybrid.propertsource;//我们要对环境进行配置,需要使用ConfigurableApplicationContext接口
ConfigurableApplicationContext configAbleCtx = new AnnotationConfigApplicationContext(PropertySourcesApp.class);//ConfigurableApplicationContext接口提供对应的可编辑Environment和PropertySources
MutablePropertySources ps = configAbleCtx.getEnvironment().getPropertySources();
Map map = new HashMap();
map.put("wow", "Origin = World of Warcraft!But Edit it already!");
//添加到Spring的环境参数中
ps.addFirst(new MapPropertySource("myPropertySource", map));
System.out.println(springEnv.getProperty("wow"));

代码添加到PropertySource中,Environment会额外维护一个PropertySources,而自己添加的PropertySources优先级是最高的,所以最后Environment::getProperty获取到的值是最后设置的值。

如果需要添加多个PropertySources,可以通过MutablePropertySources::addFirstMutablePropertySources::addLast方法来控制他们之间的优先级。

引入资源文件

*.properties是Java的标准资源文件,在Java的各种项目中常用来记录各种配置参数。Spring提供了注解和XML配置将*.properties文件中的数据整合到Spring的环境参数(Environment)中。

@PropertySource

@Configuration标记的类上使用@PropertySource注解可以引入0~n个*.properties配置文件。如下面的例子:

package chkui.springcore.example.hybrid.propertsource;@Configuration
@PropertySource("classpath:/hybrid/propertysource/config.properties")
public class PropertySourcesApp {public static void main(String[] args) {ApplicationContext ctx = new AnnotationConfigApplicationContext(PropertySourcesApp.class); System.out.println("Properties file params: " + springEnv.getProperty("Gdi"));}
}

对应的config.properties文件:

#hybrid.propertysource.config.propertiesGdi=StarCraft

同一个工程中支持使用多个@PropertySource注解来引入配置文件,也支持Ant风格(Ant-style,例如"classpath:a/b/**/config.properties")以及Spring扩展的(比如"classpath*:")的路径规则,资源路径控制会在后续的文章中介绍。

XML配置

XML配置在之前介绍容器后置处理器——BeanFactoryPostProcessor的文章中已经介绍了,他就是 PropertyPlaceholderConfigurer ,我们在XML配置文件中进行一下设置即可。

引入Bean:


直接使用context进行全局设置:

占位符替换

PropertyPlaceholderConfigurer继承了抽象类PropertyPlaceholderConfigurer,*.properties文件的读写就是在PropertyResourceConfigurer类中实现的。PropertyPlaceholderConfigurer进一步实现了配置文件中占位符(${...})替换功能

在Spring IoC容器执行Bean的扫描、加载之前添加一个环境变量(也可以动态添加然后再执行ConfigurableApplicationContext::refresh方法),就可以在很多资源路径的位置使用这个占位符,对上面的例子进行一些修改:

@Configuration
//通过占位符来设置路径
@PropertySource("classpath:${resource.propertiesPath}/config.properties")
public class PropertySourcesApp {public static void main(String[] args) {//容器启动之前设置环境变量System.setProperty("resource.propertiesPath", "/hybrid/propertysource");ApplicationContext ctx = new AnnotationConfigApplicationContext(PropertySourcesApp.class);//获取环境对象实例Environment springEnv = ctx.getEnvironment();System.out.println("Properties : " + springEnv.getProperty("Gdi"));}
}

同样的,只要环境变量存在,也可以使用占位符替换配置文件中的数据,例如:

XML中的占位符使用的格式是${resource.propertiesPath:/config},它表示使用环境变量resource.propertiesPath进行替换,如果resource.propertiesPath不存在则使用值"/config"。

@Value

我们可以在任何Bean中使用@Value注解来获取环境变量。如下面的例子:

package chkui.springcore.example.hybrid.propertsource;@Configuration
public class PropertySourcesApp {@Value("${resource.propertiesPath}")private String value;@Value("#{systemProperties['resource.propertiesPath']}")private String elValue;@Value("Resource PropertiesPath")private String staticValue;public static void main(String[] args) {System.setProperty("resource.propertiesPath", "/hybrid/propertysource");ApplicationContext ctx = new AnnotationConfigApplicationContext(PropertySourcesApp.class);PropertySourcesApp app = ctx.getBean(PropertySourcesApp.class);System.out.println("Value: " + app.value);System.out.println("EL Value: " + app.elValue);System.out.println("Static Value: " + app.staticValue);}
}

@Value可以注入一个纯字面量,如上面示例代码中的staticValue,也可以使用占位符使用环境变量中的任何值。除了使用占位符${},@Value还支持"#{systemProperties['resource.propertiesPath']}"这样具备代码执行功能的复杂表达式来获取数据,这部分功能会在后续介绍EL表达式的文章中进行分享。


转载于:https://my.oschina.net/chkui/blog/1920637


推荐阅读
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • 原文地址:https:www.cnblogs.combaoyipSpringBoot_YML.html1.在springboot中,有两种配置文件,一种 ... [详细]
  • 本文讨论了在Spring 3.1中,数据源未能自动连接到@Configuration类的错误原因,并提供了解决方法。作者发现了错误的原因,并在代码中手动定义了PersistenceAnnotationBeanPostProcessor。作者删除了该定义后,问题得到解决。此外,作者还指出了默认的PersistenceAnnotationBeanPostProcessor的注册方式,并提供了自定义该bean定义的方法。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • 在重复造轮子的情况下用ProxyServlet反向代理来减少工作量
    像不少公司内部不同团队都会自己研发自己工具产品,当各个产品逐渐成熟,到达了一定的发展瓶颈,同时每个产品都有着自己的入口,用户 ... [详细]
  • springmvc学习笔记(十):控制器业务方法中通过注解实现封装Javabean接收表单提交的数据
    本文介绍了在springmvc学习笔记系列的第十篇中,控制器的业务方法中如何通过注解实现封装Javabean来接收表单提交的数据。同时还讨论了当有多个注册表单且字段完全相同时,如何将其交给同一个控制器处理。 ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • 本文介绍了在Win10上安装WinPythonHadoop的详细步骤,包括安装Python环境、安装JDK8、安装pyspark、安装Hadoop和Spark、设置环境变量、下载winutils.exe等。同时提醒注意Hadoop版本与pyspark版本的一致性,并建议重启电脑以确保安装成功。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • Voicewo在线语音识别转换jQuery插件的特点和示例
    本文介绍了一款名为Voicewo的在线语音识别转换jQuery插件,该插件具有快速、架构、风格、扩展和兼容等特点,适合在互联网应用中使用。同时还提供了一个快速示例供开发人员参考。 ... [详细]
author-avatar
趣校区导购网
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有