前2天在处理spring中动态获取properties所配置属性的内容,由于我所写的内容是一个工具类, **不知道配置文件名称,**一般我们在获取配置项的时候都会有一个指定的配置文件名称,然而今天却没有, 着实花费了一点点时间来摸索, 特此分享!
还有一个功能就是我这边区分了业务侧与公共侧配置文件所配置的目录,最后提供了一个接口类用于获取属性。
- 先贴配置文件 value值不要配置到具体的文件,配置到目录就好了。 这样后期扩展的配置文件丢到此目录即可!
<!-- 自定义系统参数加载 -->
<!-- 配置文件--业务模块使用 -->
<bean id="bizPropertiesLoader" class="com.xxxxx.xxxxparam.ParamDefinePropertiesLoader">
<property name="locations">
<value>classpath*:conf/product/**/*.properties</value>
</property>
</bean>
<!-- 配置文件--公共侧使用 -->
<bean id="framePropertiesLoader" class="com.xxxx.xxx.param.ParamDefinePropertiesLoader">
<property name="locations">
<value>classpath*:conf/spring_properties/*.properties</value>
</property>
</bean>
- 初始化获取的配置文件内容的方法
1) 这里继承了spring 的 PropertiesLoaderSupport.java 来调用此类中的mergeProperties方法。 获取配置内容的集合 得到 Properties。
2)实现了InitializingBean此类。 此类中只有一个 afterPropertiesSet 方法。 这个方法将在所有的属性被初始化后调用,这样以下类就能调用 refresh 方法进行处理。 把配置内容都放到 ctxPropertiesMap 中,提供调用。
上代码:
public class ParamDefinePropertiesLoader extends PropertiesLoaderSupport implements SysDefineParamInterface, InitializingBean{
protected final Logger logger = LoggerFactory.getLogger(this.getClass());
private Map<String, String> ctxPropertiesMap = new HashMap<String, String>();
public String getParam(String key) {
return ctxPropertiesMap.get(key);
}
public void refresh() {
ctxPropertiesMap.clear();
try {
Properties props = this.mergeProperties();
for (Object key : props.keySet()){
String keyStr = key.toString();
String value = props.getProperty(keyStr);
ctxPropertiesMap.put(keyStr, value);
}
if (logger.isDebugEnabled()) {
logger.debug("product app config info load success , load properties config info {}", props);
}
} catch (IOException e) {
logger.error(e.getMessage(), e);
}
}
public void afterPropertiesSet() throws Exception {
this.setIgnoreResourceNotFound(true);
refresh();
}
}
- 提供2个方法去调用获取属性配置项目
public class PropertyConfigurerImpl implements PropertyConfigurerInf {
//这个正好是我在XML配置文件中写的bean id
@Autowired
private ParamDefinePropertiesLoader bizPropertiesLoader;
@Autowired
private ParamDefinePropertiesLoader framePropertiesLoader;
/**
* 获取frame配置文件参数, 主要用于公共侧
* 用法: 传key返回对应的value数据
* classpath*:conf/spring_properties/*.properties
* @param key
* @return
*/
@Override
public String getFrameProperty(String key) {
return framePropertiesLoader.getParam(key);
}
/**
* 获取frame配置文件参数: 主要用于业务模块配置文件的加载
* 用法: 传key返回对应的value数据
* classpath*:conf/product/*.properties
* @param key
* @return
*/
@Override
public String getProductProperty(String key) {
return bizPropertiesLoader.getParam(key);
}
}
好了。 以上就是通过java代码动态获取properties配置文件中的代码,不管你的配置文件名称是啥, 只要写在指定目录下就能读取出来, 当然同一个目录中不同文件,存在相同的key,只取最后一项,这个需要注意!