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

我在哪里找到如何加载自定义属性文件: