Spring 数据来自多个文件的多个数据源
Spring data multiple datasources from multiple files
我在项目中有 2 个(或更多)不同的配置属性文件,我想为不同的数据源加载它们。
我试过如下:
@Bean
@ConfigurationProperties(locations = {"#{myconfigroot.getRootFolder()}/datasource1.properties"}
public static DataSource getFirstDatasource() {
return DataSourceBuilder.create().build();
}
但显然这不会起作用,因为 ConfigurationProperties 注释位置 属性 不通过 spEL。 (或者我写错了吗?)myconfigroot.getRootFolder() 是一个静态方法,returns datasource1.properties.
的路径
请指教。谢谢
===== 已编辑 =======
我相信当有人希望他们的应用程序想要加载不同的配置文件时,这是一个常见的问题。由于某些原因,文件位置和名称不能放在启动脚本或命令行中,或者只能在运行时确定路径,这将需要 spring 在创建 bean 时加载它们。
我尝试使用 PropertySourcePlaceHolderConfigurer 一次,但似乎也不起作用。
谁能分享一些灯?
最新的 Spring 引导(版本 1.3.5)在这种情况下不支持 SpEL。
参见注释的 JavaDoc @ConfigurationProperties
Note that contrary to {@code @Value}, SpEL expressions are not
evaluated since property values are externalized.
我找到了一种自定义 Spring 引导默认行为的方法,如下所示:
例如,我在某处有 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 引导启动,MyProperties bean 名称和密码字段将从 database.properties 注入。然后您可以将 MyProperties bean 作为配置连接到其他 bean。
希望对您有所帮助!
我终于通过使用以下机制使其工作:
public class DatasourcePostProcessor implements EnvironmentPostProcessor {
@Override
public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) {
Properties p = new Properties();
p.load(new FileInputStream(new File(getRootFolder() + "/datasource1.properties")));
Map<String, Object> propMap = new HashMap<>();
for (Map.Entry<Object, Object> entry : p.entrySet()) {
propMap.put(entry.getKey().toString(), entry.getValue());
}
MapPropertySource source = new MapPropertySource("datasource1", propMap);
environment.getPropertySources().addLast(source);
}
}
并将环境 post 处理器注册到 spring.factories:
org.springframework.boot.env.EnvironmentPostProcessor=com.myorg.test.DatasourcePostProcessor
无论如何,希望这对人们有所帮助并接受第一个答案,因为它启发了我。此外 post 以下参考资料来自 google 在研究过程中发现的搜索:
我在哪里找到如何将 属性 源与环境连接起来:https://github.com/spring-projects/spring-boot/issues/4595
我在哪里找到如何加载自定义属性文件:
我在项目中有 2 个(或更多)不同的配置属性文件,我想为不同的数据源加载它们。
我试过如下:
@Bean
@ConfigurationProperties(locations = {"#{myconfigroot.getRootFolder()}/datasource1.properties"}
public static DataSource getFirstDatasource() {
return DataSourceBuilder.create().build();
}
但显然这不会起作用,因为 ConfigurationProperties 注释位置 属性 不通过 spEL。 (或者我写错了吗?)myconfigroot.getRootFolder() 是一个静态方法,returns datasource1.properties.
的路径请指教。谢谢
===== 已编辑 =======
我相信当有人希望他们的应用程序想要加载不同的配置文件时,这是一个常见的问题。由于某些原因,文件位置和名称不能放在启动脚本或命令行中,或者只能在运行时确定路径,这将需要 spring 在创建 bean 时加载它们。
我尝试使用 PropertySourcePlaceHolderConfigurer 一次,但似乎也不起作用。
谁能分享一些灯?
最新的 Spring 引导(版本 1.3.5)在这种情况下不支持 SpEL。
参见注释的 JavaDoc @ConfigurationProperties
Note that contrary to {@code @Value}, SpEL expressions are not evaluated since property values are externalized.
我找到了一种自定义 Spring 引导默认行为的方法,如下所示:
例如,我在某处有 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 引导启动,MyProperties bean 名称和密码字段将从 database.properties 注入。然后您可以将 MyProperties bean 作为配置连接到其他 bean。
希望对您有所帮助!
我终于通过使用以下机制使其工作:
public class DatasourcePostProcessor implements EnvironmentPostProcessor {
@Override
public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) {
Properties p = new Properties();
p.load(new FileInputStream(new File(getRootFolder() + "/datasource1.properties")));
Map<String, Object> propMap = new HashMap<>();
for (Map.Entry<Object, Object> entry : p.entrySet()) {
propMap.put(entry.getKey().toString(), entry.getValue());
}
MapPropertySource source = new MapPropertySource("datasource1", propMap);
environment.getPropertySources().addLast(source);
}
}
并将环境 post 处理器注册到 spring.factories:
org.springframework.boot.env.EnvironmentPostProcessor=com.myorg.test.DatasourcePostProcessor
无论如何,希望这对人们有所帮助并接受第一个答案,因为它启发了我。此外 post 以下参考资料来自 google 在研究过程中发现的搜索:
我在哪里找到如何将 属性 源与环境连接起来:https://github.com/spring-projects/spring-boot/issues/4595
我在哪里找到如何加载自定义属性文件: