我在项目中有 2 个(或更多)不同的配置属性文件,我想为不同的数据源加载它们。
我尝试做如下:
@Bean
@ConfigurationProperties(locations = {"#{myconfigroot.getRootFolder()}/datasource1.properties"}
public static DataSource getFirstDatasource() {
return DataSourceBuilder.create().build();
}
但显然这不会起作用,因为 ConfigurationProperties 注释位置属性不通过 spEL。 (或者可能是我写错了?)myconfigroot.getRootFolder() 是一个返回 datasource1.properties 路径的静态方法。
请指教。谢谢。
===== 已编辑 =======
我相信当有人希望他们的应用程序想要加载不同的配置文件时,这是一个常见的问题。由于某些原因,文件位置和名称不能放在启动脚本或命令行中,或者只能在运行时确定路径,这将需要spring 在创建bean 时加载它们。
我尝试使用 PropertySourcePlaceHolderConfigurer 一次,但似乎也不起作用。
谁能分享一些灯?
最佳答案
在这种情况下,最新的 Spring boot(版本 1.3.5)不支持 SpEL。
参见注解@ConfigurationProperties的JavaDoc
Note that contrary to {@code @Value}, SpEL expressions are not evaluated since property values are externalized.
我找到了一种自定义 Spring boot 默认行为的方法,如下所示:
例如,我在某个地方有 database.properties 文件,由于某种原因我无法在运行前获取位置。
username=mike
password=password
相应地,定义 POJO 映射到属性:
@Component
@ConfigurationProperties(locations = "myConfiguration")// myConfiguration is customized placeholder
public class MyProperties{
String username;
String password;
//Getters, Setters…
}
然后,扩展默认StandardEnvironment :
public class MyEnvironment extends StandardEnvironment {
@Override
public String resolvePlaceholders(String location) {
if (location.equals("myConfiguration")) {
//Whatever you can do, SpEL, method call...
//Return database.properties path at runtime in this case
return getRootFolder() + "datasource.properties";
} else {
return super.resolvePlaceholders(text);
}
}
}
最后在Spring boot main方法入口中应用:
@SpringBootApplication
public class MyApplication extends SpringBootServletInitializer {
public static void main(String[] args) {
new SpeedRestApplication()
.configure(new SpringApplicationBuilder(SpeedRestApplication.class).environment(new MyEnvironment()))//Replace default StandardEnvironment
.run(args);
}
}
一旦 Spring boot 启动,MyProperties bean 名称和密码字段就会从 database.properties 中注入(inject)。然后您可以将 MyProperties bean 作为配置连接到其他 bean。
希望对您有所帮助!
关于java - 来自多个文件的Spring数据多个数据源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37806716/