java - 来自多个文件的Spring数据多个数据源

标签 java spring spring-boot spring-data-jpa

我在项目中有 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/

相关文章:

java - 如何用 Java 编写这个公式?

java - 使用 Hibernate 更新查询性能

spring - 将图像上传到 Spring Boot 和 S3 all In-Memory

java - Eclipse 标签的用途是什么——比如@author、@version、@link?

java - Gradle:无法创建 AppPlugin 类型的插件

java - 将 SoapUI 属性值设置为今天 + 1 年

java - 如何在 <form :select>? 中使用占位符属性

spring - 我想根据标志加载特定的类,而不是加载两个类并使用 Springs 中所需的一个类

spring - 如何通过 Spring 占位符在 yaml 中表达对象列表或数组?

spring-boot - 将CSS文件添加到Spring Boot + Spring Security Thymeleaf文件