如何使用Spring-Boot外部化数据源配置?

我目前正在尝试将现有的spring应用程序移至spring-boot,因此重新创建了无需引导即可工作的东西。

我想从外部源配置一些属性(例如spring.datasource。*)。具体来说是一个包含多个属性文件的文件夹。

我设置了一个配置类,该类创建如下的propertyPlaceholder配置器:

@Configuration

public class PropertySourceConfiguration {

@Bean

public static PropertySourcesPlaceholderConfigurer defaultsPlaceHolderConfigurer() throws IOException {

PropertySourcesPlaceholderConfigurer propertyConfigurer = new PropertySourcesPlaceholderConfigurer();

propertyConfigurer.setLocations(new PathMatchingResourcePatternResolver().getResources("classpath*:/*-defaults.properties"));

propertyConfigurer.setIgnoreUnresolvablePlaceholders(true);

return propertyConfigurer;

}

@Bean

public static PropertySourcesPlaceholderConfigurer externalPlaceHolderConfigurer() throws IOException {

PropertySourcesPlaceholderConfigurer propertyConfigurer = new PropertySourcesPlaceholderConfigurer();

propertyConfigurer.setLocations(new

PathMatchingResourcePatternResolver().getResources("file:/my-config-path/*.properties"));

propertyConfigurer.setOrder(1);

propertyConfigurer.setIgnoreUnresolvablePlaceholders(true);

return propertyConfigurer;

}

这似乎适用于大多数事情(例如amqp或我自己的配置属性),但是当我尝试使用spring-data-

jpa时,它们将被忽略。基本上spring.datasource.url,在这些文件中进行设置(以及用于自动配置的其他操作)无效。

通过查看PropertySourcesPropertyResolveri

的日志,我发现这些配置程序属于localProperties查找时未使用的组spring.datasource.*

有没有一种方法可以解决此问题,或者有更好的方法将外部属性文件添加到我的上下文中?

我知道我可以设置spring.config.location为执行类似的操作,但是我无法将命令行属性传递给我的应用程序,因此需要在我的应用程序中执行此配置。此属性无法实现。

设置spring.config.location

尝试1:

public class ServletInitializer extends SpringBoot" title="SpringBoot">SpringBootServletInitializer {

@Override

protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {

return application.sources(CampaignServiceStarter.class);

}

@Override

public void onStartup(ServletContext servletContext) throws ServletException {

super.onStartup(servletContext);

servletContext.setInitParameter("spring.config.location", "file:/my-config-path/*.properties");

}

}

尝试2:

public class ServletInitializer extends SpringBootServletInitializer {

@Override

protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {

return application.sources(CampaignServiceStarter.class).properties("spring.config.location=file:/my-config-path/*.properties");

}

}

在这两种情况下,外部属性都没有被拾取(即使在以前工作过的地方,例如amqp配置)

回答:

Spring Boot参考指南》的本节介绍了如何使用外部配置。

spring.config.location是,其中包含您的目录路径application.properties的文件。它采用逗号分隔的值列表,因此您可以指定多个路径。它不需要通配符。这是一个路径,不是匹配多个属性文件的表达式。如果要更改默认值,请application使用将其更改为spring.config.name其他值。

Spring Boot的默认值被视为Spring Boot的其余部分(具有默认配置等)。

如果您想进行更广泛的(预)配置,则应使用ApplicationContextInitializer将手动添加PropertySource到中Environment。在Spring

Boot参考指南中提到了这一点。

有关初始化程序外观的示例。

public class ConfigurationInitializer implements ApplicationContextInitializer {

private static final String DEFAULT_PROPS = "classpath*:/*-defaults.properties";

private static final String EXTERNAL_PROPS = "file:/my-config-path/*.properties";

public void initialize(ConfigurableApplicationContext applicationContext) {

final Resource[] defaultConfigs = applicationContext.getResources(DEFAULT_PROPS);

final Resource[] externalConfigs = applicationContext.getResources(EXTERNAL_PROPS);

final ConfigurableEnvironment env = applicationContext.getEnvironment();

final MutablePropertySources mps = env.getPropertySources();

for (Resource r : externalConfigs) {

mps.addLast(new ResourcePropertySource(r.getFilename(), r);

}

for (Resource r : defaultConfigs) {

mps.addLast(new ResourcePropertySource(r.getFilename(), r);

}

}

}

然后,在构建您的应用程序对象时,如下添加它。

public class ServletInitializer extends SpringBootServletInitializer {

@Override

protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {

return application.sources(CampaignServiceStarter.class)

.initializers(new ConfigurationInitializer());

}

}

现在,应该将配置添加到属性源列表中。

以上是 如何使用Spring-Boot外部化数据源配置? 的全部内容, 来源链接: utcz.com/qa/409078.html

回到顶部