建设一个小说网站,网站平台策划书,临沂做网站建设找哪家,cvv钓鱼网站怎么做简介
在spring中占位符用${}表示#xff0c;他可以很好的实现将变动的数据与代码分离#xff0c;这部分变化的数据就可以使用配置文件等诸多手段动态配置
spring中的占位符应用的非常广泛#xff0c;比如Value注解 RequestMapping Feign等都支持${}
spring为该功能定义了…简介
在spring中占位符用${}表示他可以很好的实现将变动的数据与代码分离这部分变化的数据就可以使用配置文件等诸多手段动态配置
spring中的占位符应用的非常广泛比如Value注解 RequestMapping Feign等都支持${}
spring为该功能定义了一个接口 StringValueResolver可以自定义实现类
可以通过beanFactory.addEmbeddedValueResolver()设置自己的解析器
默认占位符解析器 源码解析
在实例化非懒加载单例Bean之前就会设置一个默认的占位符解析器如下
org.springframework.context.support.AbstractApplicationContext#finishBeanFactoryInitialization
if (!beanFactory.hasEmbeddedValueResolver()) {beanFactory.addEmbeddedValueResolver(strVal - getEnvironment().resolvePlaceholders(strVal));
}其实就是从环境变量中根据key找到value环境变量上节已经介绍过了,占位符解析代码如下
private final ListStringValueResolver embeddedValueResolvers new CopyOnWriteArrayList();public void addEmbeddedValueResolver(StringValueResolver valueResolver) {this.embeddedValueResolvers.add(valueResolver);
}public String resolveEmbeddedValue(Nullable String value) {if (value null) {return null;}String result value;for (StringValueResolver resolver : this.embeddedValueResolvers) {result resolver.resolveStringValue(result);if (result null) {return null;}}return result;
}遍历StringValueResolver解析器由于spring默认值添加了一个就是上面的getEnvironment().resolvePlaceholders(strVal)。
大概逻辑就是找一下有没有占位符没有就直接返回原值如果有就环境变量找一下如果没有就使用默认值
值得关注的是并不是找 ${ 开头的而是任意地方可以匹配到就行所有例如 a${b:c}这样都是可以的
占位符定义如下
public static final String PLACEHOLDER_PREFIX ${; public static final String PLACEHOLDER_SUFFIX };public static final String VALUE_SEPARATOR :; // 看是否有默认值resolvePlaceholders最终进入到如下代码
其实就是上节介绍的环境变量最终保存的地方,从环境变量获取
protected T T getProperty(String key, ClassT targetValueType, boolean resolveNestedPlaceholders) {if (this.propertySources ! null) {// propertySources就是上节介绍的各种环境变量操作系统变量启动参数变量配置文件等for (PropertySource? propertySource : this.propertySources) {Object value propertySource.getProperty(key);if (value ! null) {if (resolveNestedPlaceholders value instanceof String) {value resolveNestedPlaceholders((String) value);}logKeyFound(key, propertySource, value);return convertValueIfNecessary(value, targetValueType);}}}return null;
}测试
下面我们简单测试下
public static void main(String[] args) {System.setProperty(uri, getOrderId);AnnotationConfigApplicationContext context new AnnotationConfigApplicationContext(AppConfig.class);String value context.getBeanFactory().resolveEmbeddedValue(/api/${uri:xx});System.out.println(value);
}输出/api/getOrderId自定义占位符解析
自定义占位符解析只需要实现StringValueResolver就可以了
例如
public static void main(String[] args) {System.setProperty(uri, getOrderId);AnnotationConfigApplicationContext context new AnnotationConfigApplicationContext();context.getBeanFactory().addEmbeddedValueResolver(strVal - {strVal strVal.replaceAll(\\[order]:, );return context.getEnvironment().resolvePlaceholders(strVal);});context.register(AppConfig.class);context.refresh();String value context.getBeanFactory().resolveEmbeddedValue(/api/[order]:${uri:xx});System.out.println(value);}输出/api/getOrderId总结
占位符的解析就到这里了后面我们会介绍spring表达式 欢迎关注学习不迷路