Spring技巧之如何动态读取配置⽂件
⽬录
Spring 动态读取配置⽂件
需求背景
⽅案⼀
⽅案⼆风油精的妙用
⽅案三
动态读取配置⽂件中的信息
1、⾸先是写⼀个配置⽂件,⽅便动态加载
1、利⽤类加载器等读取配置⽂件
Spring 动态读取配置⽂件
需求背景
最近碰到的需求⼤概是这样,我们要在⼀个现有的项⽬基础上进⾏⼆次开发,但⼜不愿意碰原有项⽬⾥的代码。所以采⽤了Maven依赖的⽅式——新建⼀个Maven项⽬作为主要开发环境,将原有项⽬作为Maven依赖(war形式)引⼊进来。这样在新建的扩展项⽬中打包出来的war将会是合并两个项⽬的所有代码。
⽽在实际搭建的过程中碰到这样⼀个问题,Spring配置⽂件中的 <context:property-placeholder />只允许存在⼀个, ⽽且这个机会已经被原有项⽬使⽤了——这种说法并不严谨,所以以下给出三种解决⽅案:
电脑升级
⽅案⼀
以上关于<context:property-placeholder />的说法并不严谨,其实多次添加也不会报错; 但只会有⼀个⽣效(含义是如果spring 从所设置的配置⽂件集合中没有读取到属性去替换占位符,就会报错, 除⾮设置 ignore-unresolvable ) ,如果按照如下设置⽅式,就可以避免这种情况,并接触本次需求。
<!-- 如果要配置多个, 就要设置ignore-unresolvable ="true" -->
<context:property-placeholder location="classpath:extend/db.properties" ignore-unresolvable="true" /
>
<context:property-placeholder location="classpath:db.properties" ignore-unresolvable="true" />
但是这样带来的坏处就是:
1. 将发现错误的时机推迟到了运⾏时,这在系统⽐较庞⼤时实在是⼤忌。
2. 属性重复时的替换危机,这种BUG想要出来,耗费的时间和精⼒想想就不寒⽽栗。
⽅案⼆
第⼆个⽅法就是BeanFactoryPostProcessor接⼝,注意该接⼝的回调时机早于占位符替换操作。
// BeanFactoryPostProcessor.postProcessBeanFactory
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
// 我们⾃⼰去读取指定的配置⽂件
Properties prop = null ;
try {
prop = PropertiesLoaderUtils.loadAllProperties("extend/db.properties", Thread.currentThread().getContextClassLoader());
} catch (IOException e) {
e.printStackTrace();
}
if(null == prop){
防晒霜是在哪个步骤涂
return;
}
// 注⼊到特定的Bean的特定属性中
BeanDefinition beanDefinition = BeanDefinition("dataSource_extend");
super.postProcessBeanFactory(beanFactory);
}
⽅案三
还有⼀种⽅法就是使⽤Spring的⽗⼦容器的关系,将这个 <context:property-placeholder/>和依赖它的Bean全部注册到⼀个全新容器中,然后将该容器作为现有容器的Parent。此⽅法过去取巧,本⼈没有实际去尝试。
明星陪客价格表
动态读取配置⽂件中的信息
1、⾸先是写⼀个配置⽂件,⽅便动态加载读取配置文件失败
jedis.properties
key-value形式保存
谢霆锋和陈坤1、利⽤类加载器等读取配置⽂件
1.读取配置⽂件
InputStream is=ClassLoader().getResourceAsStream("jedis.properties");
2.创建properties对象
Properteis pro=new Properties();
3.关联⽂件
pro.load(is);
4.然后在项⽬中可以动态加载key获取到value值
以上为个⼈经验,希望能给⼤家⼀个参考,也希望⼤家多多⽀持。