Spring PropertyResolver 占位符解析(一)API 介绍

Spring 系列目录(https://www.cnblogs.com/binarylei/p/10198698.html)

Spring 3.1 提供了新的占位符解析器 PropertyResolver,默认实现为 PropertySourcesPropertyResolver。相关文章如下:

  1. Spring PropertyResolver 占位符解析(一)API 介绍
  2. Spring PropertyResolver 占位符解析(二)源码分析

一、PropertyResolver API

PropertyResolver 的默认实现是 PropertySourcesPropertyResolver,Environment 实际上也是委托 PropertySourcesPropertyResolver 完成 占位符的解析和类型转换。 类型转换又是委托 ConversionService 完成的。

  1. public interface PropertyResolver {
  2. // 1. contains
  3. boolean containsProperty(String key);
  4. // 2.1 获取指定 key,不存在可以指定默认值,也可以抛出异常
  5. String getProperty(String key);
  6. String getProperty(String key, String defaultValue);
  7. // 2.2 类型转换,委托 ConversionService 完成
  8. <T> T getProperty(String key, Class<T> targetType);
  9. <T> T getProperty(String key, Class<T> targetType, T defaultValue);
  10. String getRequiredProperty(String key) throws IllegalStateException;
  11. <T> T getRequiredProperty(String key, Class<T> targetType) throws IllegalStateException;
  12. // 3. 解析占位符 ${key}
  13. String resolvePlaceholders(String text);
  14. String resolveRequiredPlaceholders(String text) throws IllegalArgumentException;
  15. }

PropertyResolver 组件完成了两件事:一是占位符解析 ${key};二是类型转换。使用方法如下:

  1. @Test
  2. public void PropertyResolverTest() {
  3. PropertySource propertySource = new MapPropertySource("source",
  4. Collections.singletonMap("name", "binarylei"));
  5. MutablePropertySources propertySources = new MutablePropertySources();
  6. propertySources.addFirst(propertySource);
  7. PropertyResolver propertyResolver = new PropertySourcesPropertyResolver(propertySources);
  8. Assert.assertEquals("binarylei", propertyResolver.getProperty("name"));
  9. Assert.assertEquals("name is binarylei", propertyResolver.resolvePlaceholders("name is ${name}"));
  10. }

二、Spring 是如何使用的

(1) xml 配置

  1. <context:property-placeholder
  2. location="属性文件,多个之间逗号分隔"
  3. file-encoding="文件编码"
  4. ignore-resource-not-found="是否忽略找不到的属性文件"
  5. ignore-unresolvable="是否忽略解析不到的属性,如果不忽略,找不到将抛出异常"
  6. properties-ref="本地Properties配置"
  7. local-override="是否本地覆盖模式,即如果true,那么properties-ref的属性将覆盖location加载的属性,否则相反"
  8. system-properties-mode="系统属性模式,默认ENVIRONMENT(表示先找ENVIRONMENT,再找properties-ref/location的),NEVER:表示永远不用ENVIRONMENT的,OVERRIDE类似于ENVIRONMENT"
  9. order="顺序"
  10. />
  • location:表示属性文件位置,多个之间通过如逗号/分号等分隔;
  • file-encoding:文件编码;
  • ignore-resource-not-found:如果属性文件找不到,是否忽略,默认 false,即不忽略,找不到将抛出异常
  • ignore-unresolvable:是否忽略解析不到的属性,如果不忽略,找不到将抛出异常
  • properties-ref:本地 java.util.Properties 配置
  • local-override:是否本地覆盖模式,即如果 true,那么 properties-ref 的属性将覆盖 location 加载的属性
  • system-properties-mode:系统属性模式,ENVIRONMENT(默认),NEVER,OVERRIDE
    1. ENVIRONMENT:将使用 Spring 3.1 提供的 PropertySourcesPlaceholderConfigurer,其他情况使用 Spring 3.1 之前的 PropertyPlaceholderConfigurer。如果是本地覆盖模式:那么查找顺序是:properties-ref、location、environment,否则正好反过来;
    2. OVERRIDE: PropertyPlaceholderConfigurer 使用,因为在 spring 3.1 之前版本是没有 Enviroment 的,所以 OVERRIDE 是 spring 3.1 之前版本的 Environment。如果是本地覆盖模式:那么查找顺序是:properties-ref、location、System.getProperty(), System.getenv(),否则正好反过来;
    3. NEVER:只查找 properties-ref、location;
  • order:当配置多个context:property-placeholder/时的查找顺序,关于顺序问题请参考:<http://www.iteye.com/topic/1131688 >

(2) 注解配置

  1. @Configuration
  2. @PropertySource(value = "classpath:resources.properties", ignoreResourceNotFound = false)
  3. public class AppConfig {
  4. // 如果想进行 Bean 属性的占位符替换,需要注册 PropertySourcesPlaceholderConfigurer
  5. @Bean
  6. public PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() {
  7. return new PropertySourcesPlaceholderConfigurer();
  8. }
  9. }

如上配置等价于 XML 中的 context:property-placeholder/ 配置。

(3) 占位符替换

使用 Environment 属性替换,如:

  1. <context:property-placeholder location="classpath:${env}/resources.properties"/>
  2. <context:component-scan base-package="com.sishuok.${package}"/>
  3. <import resource="classpath:${env}/ctx.xml"/>

同样可以在注解中使用占位符。

  1. @PropertySource(value = "classpath:${env}/resources.properties")
  2. @ComponentScan(basePackages = "com.sishuok.${package}")
  3. @ImportResource(value = {"classpath:${env}/cfg.xml"})
  4. @Value("${env}")
  5. new ClassPathXmlApplicationContext("classpath:${env}/cfg.xml")

参考:

  1. 《pring3.1新属性管理API:PropertySource、Environment、Profile》:https://jinnianshilongnian.iteye.com/blog/2000183

每天用心记录一点点。内容也许不重要,但习惯很重要!

Spring PropertyResolver 占位符解析(一)API 介绍的更多相关文章

  1. Spring PropertyResolver 占位符解析(二)源码分析

    Spring PropertyResolver 占位符解析(二)源码分析 Spring 系列目录(https://www.cnblogs.com/binarylei/p/10198698.html) ...

  2. spring源码解析(一)---占位符解析替换

    一.结构类图 ①.PropertyResolver : Environment的顶层接口,主要提供属性检索和解析带占位符的文本.bean.xml配置中的所有占位符例如${}都由它解析 ②.Config ...

  3. spring占位符解析器---PropertyPlaceholderHelper

    一.PropertyPlaceholderHelper 职责 扮演者占位符解析器的角色,专门用来负责解析路劲中or名字中的占位符的字符,并替换上具体的值 二.例子 public class Prope ...

  4. Spring源码解析之PropertyPlaceholderHelper(占位符解析器)

    Spring源码解析之PropertyPlaceholderHelper(占位符解析器) https://blog.csdn.net/weixin_39471249/article/details/7 ...

  5. SpringBoot环境属性占位符解析和类型转换

    前提 前面写过一篇关于Environment属性加载的源码分析和扩展,里面提到属性的占位符解析和类型转换是相对复杂的,这篇文章就是要分析和解读这两个复杂的问题.关于这两个问题,选用一个比较复杂的参数处 ...

  6. 【mybatis源码学习】mybtias基础组件-占位符解析器

    一.占位符解析器源码 1.占位符解析器实现的目标 通过解析字符串中指定前后缀中的字符,并完成相应的功能. 在mybtias中的应用,主要是为了解析Mapper的xml中的sql语句#{}中的内容,识别 ...

  7. Spring属性占位符 PropertyPlaceholderConfigurer

    http://www.cnblogs.com/yl2755/archive/2012/05/06/2486752.html PropertyPlaceholderConfigurer是个bean工厂后 ...

  8. Spring PropertyPlaceholderConfigurer占位符用法

    1.PropertyPlaceholderConfigurer是一个bean工厂后置处理器的实现,也就是BeanFactoryPostProcessor接口的一个实现.PropertyPlacehol ...

  9. spring boot ${}占位符不起作用

    问题:在 pom.xml 文件里定义好属性标签,然后在 properties或者xml 中使用${key}引用,打包之后就会自动替换掉. 但是在使用 spring boot 后发现,@可以替换,但是$ ...

随机推荐

  1. OpenCV 调用双摄像头

    #include <opencv2/opencv.hpp> #include<iostream> using namespace cv; using namespace std ...

  2. java.security.MessageDigest (2) 生成安全令牌!

    时候,我们需要产生一个数据,这个数据保存了用户的信息,但加密后仍然有可能被人使用,即便他人不确切的了解详细信息... 好比,我们在上网的时候,很多网页都会有一个信息,是否保存登录信息,以便下次可以直接 ...

  3. Executors与ThreadPoolExecutor

    最近阿里发布的 Java开发手册中强制线程池不允许使用 Executors 去创建,而是通过 ThreadPoolExecutor 的方式,这样的处理方式让写的同学更加明确线程池的运行规则,规避资源耗 ...

  4. jms学习笔记

    https://www.cnblogs.com/zhuxiaojie/p/5564187.html //创建一个session //第一个参数:是否支持事务,如果为true,则会忽略第二个参数,被jm ...

  5. View可以设置tag携带数据

    View可以设置tag携带数据.       例子             初始化:ImageView  iv_brand2              设置:iv_brand2.setTag(strB ...

  6. js setInterval参数设置

    语法  setInterval(code,interval) ①可以有第三个参数,第三个参数作为第一个参数(函数)的参数 ②第一个参数是函数,有三种形式: 1.传函数名,不用加引号,也不加括号,如 s ...

  7. Unity3D研究院之设置自动旋转屏幕默认旋转方向

    如下图所示,在处理屏幕默认旋转方向的时候可以在这里进行选择,上下左右一共是4个方向. 策划的需求是游戏采用横屏,但是要求支持两个方向自动旋转,如下图所示,我的设置是这样的. Default Orien ...

  8. [剑指Offer]48-最长不含重复字符的子字符串(递归思想,循环实现)

    题意 如题,字符串只含a-z,输出该子串长度.例:"arabcacfr",输出4. 解题思路 递归思想 计f(i)为以第i个字符结尾的最长不含重复字符的子串长度. 状态转移:计d为 ...

  9. iOS版本设置

    Base SDK指的是当前编译所用的SDK 版本: iOS Deployment Target指的是,编译后的 app 可在 终端的哪个 版本上运行. 设置方法: 点击xcode工程左侧项目名称-&g ...

  10. bbs项目实现点赞和评论的功能

    一.点赞功能 思路是这样的: 1.对点赞和踩都设置一个相同的class,然后对这个class绑定点击事件 2.点击触发ajax请求,我们对赞的标签设置了一个class属性,对踩的标签没有设置这个cla ...