spring-core组件详解——PropertyResolver属性解决器
2016-05-05 00:00
633 查看
PropertyResolver属性解决器,主要具有两个功能:
通过propertyName属性名获取与之对应的propertValue属性值(getProperty)。
把${propertyName:defaultValue}格式的属性占位符,替换为实际的值(resolvePlaceholders)。
注意:getProperty获取的属性值,全都是调用resolvePlaceholders进行占位符替换后的值。
组件体系图如下:
PropertyResolver接口:
该接口定义了组件所具有的所有功能。其一是通过key获取对应的value,当获取不到value时,有3种选择:返回null值、使用指定的默认值或者抛出一个非法状态异常。获取到的value值默认是String类型,当然也可以认为指定一种类型,这依赖于ConversionService进行类型转换。
另外还有一个问题:属性值中可以包含${}格式的占位符,因此,接口添加了另一个功能就是替换属性值中的占位符(注意:属性名是不允许存在占位符的,就算存在,组件也不会当作占位符进行替换)。当占位符无法替换时,也有2种选择:保持原样或者抛出一个非法参数异常。具体接口如下:
ConfigurablePropertyResolver接口:
该接口定义了如何对组件本身进行配置。如:刚刚提到获取value时可以指定任意类型,这依赖于ConversionService进行类型转换,当前接口就提供了对ConversionService的设置和获取。另外,可以配置属性占位符的格式,包括:占位符前缀(默认为"${")、占位符后缀(默认为"}")、占位符值分隔符(默认为":",用于分隔propertyName和defaultValue)。组件还可以设置哪些属性是必须存在的,还可以校验必须存在的属性是否真的存在(不存在的话会抛出异常)。具体接口如下:
AbstractPropertyResolver类:
上述两个接口的抽象实现类。它实现了ConfigurablePropertyResolver接口的所有方法。关于PropertyResolver接口方法,还有3个getProperty方法需要子类实现(其他重载方法均调用这3个方法):
至于替换属性占位符,则借助2个PropertyPlaceholderHelper属性占位符助手(工具类)对象完成,这2个对象一个为严格模式,一个为非严格模式。
PropertySourcesPropertyResolver类:
该类是体系中唯一的完整实现类。它以PropertySources属性源集合(内部持有属性源列表List<PropertySource>)为属性值的来源,按序遍历每个PropertySource,获取到一个非null的属性值则返回。
通过propertyName属性名获取与之对应的propertValue属性值(getProperty)。
把${propertyName:defaultValue}格式的属性占位符,替换为实际的值(resolvePlaceholders)。
注意:getProperty获取的属性值,全都是调用resolvePlaceholders进行占位符替换后的值。
组件体系图如下:
PropertyResolver接口:
该接口定义了组件所具有的所有功能。其一是通过key获取对应的value,当获取不到value时,有3种选择:返回null值、使用指定的默认值或者抛出一个非法状态异常。获取到的value值默认是String类型,当然也可以认为指定一种类型,这依赖于ConversionService进行类型转换。
另外还有一个问题:属性值中可以包含${}格式的占位符,因此,接口添加了另一个功能就是替换属性值中的占位符(注意:属性名是不允许存在占位符的,就算存在,组件也不会当作占位符进行替换)。当占位符无法替换时,也有2种选择:保持原样或者抛出一个非法参数异常。具体接口如下:
ConfigurablePropertyResolver接口:
该接口定义了如何对组件本身进行配置。如:刚刚提到获取value时可以指定任意类型,这依赖于ConversionService进行类型转换,当前接口就提供了对ConversionService的设置和获取。另外,可以配置属性占位符的格式,包括:占位符前缀(默认为"${")、占位符后缀(默认为"}")、占位符值分隔符(默认为":",用于分隔propertyName和defaultValue)。组件还可以设置哪些属性是必须存在的,还可以校验必须存在的属性是否真的存在(不存在的话会抛出异常)。具体接口如下:
AbstractPropertyResolver类:
上述两个接口的抽象实现类。它实现了ConfigurablePropertyResolver接口的所有方法。关于PropertyResolver接口方法,还有3个getProperty方法需要子类实现(其他重载方法均调用这3个方法):
String getProperty(String key); <T> T getProperty(String key, Class<T> targetType); <T> Class<T> getPropertyAsClass(String key, Class<T> targetType); /** * 当前类还额外定义了一个抽象方法,用于直接返回获取到的value值(不进行占位符替换)。 * 一般的getProperty方法默认都会替换掉value值中的占位符后返回。 */ protected abstract String getPropertyAsRawString(String key);
至于替换属性占位符,则借助2个PropertyPlaceholderHelper属性占位符助手(工具类)对象完成,这2个对象一个为严格模式,一个为非严格模式。
PropertySourcesPropertyResolver类:
该类是体系中唯一的完整实现类。它以PropertySources属性源集合(内部持有属性源列表List<PropertySource>)为属性值的来源,按序遍历每个PropertySource,获取到一个非null的属性值则返回。
相关文章推荐
- java 向上转型和向下转型
- java Socket的怪异之处
- 这些书将会助你进阶Java大神
- IDEA怎么查看现在的项目使用的JDK版本? 2016年4月19日22:51
- maven搭建springMVC 的时候报错,提示param element param-name
- java中路径问题总结
- java中HashMap详解
- ubuntu14.0 Server安装JDK1.8.0
- 线程安全总结
- struts2的result重定向到另一个action
- java中的匿名内部类总结
- Spring MVC 中 HandlerInterceptorAdapter的使用
- java pdfbox2.0.0 获取表格和字
- java配置错误页面方法
- java反射详解及说明
- java学习之路之邮件相关
- java 处理CSV(分号里面有逗号)
- [Java] 作业5 (数组)
- java 正则表达式去除标点符号
- Java实现二叉树后序非递归遍历(好理解)