这是一个直接的多项目分级构建--为了简单起见--包含两个项目。一个项目是“主要”的Spring项目-IE。Spring上下文在此项目中初始化。另一个是带有一些数据库实体和数据源配置的“支持”模块。我们使用基于注释的配置。
我希望能够在支持模块中定义一组配置属性,并且根据活动的spring配置文件,相应地加载数据源配置。
这篇SA帖子让我在不同的答案中找到了不同的链接,并从这篇文章中找到了我的解决方案。结构和代码如下:
mainproject
src
main
groovy
Application.groovy
resourcers
application.yml
submodule
src
main
groovy
PropertiesConfiguration.groovy
DataSource.groovy
resources
datasource.yml
@Configuration
class PropertiesConfiguration {
@Bean
public PropertySourcesPlaceholderConfigurer configure() {
PropertySourcesPlaceholderConfigurer configurer = new PropertySourcesPlaceholderConfigurer()
YamlPropertiesFactoryBean yamlPropertiesFactoryBean = new YamlPropertiesFactoryBean()
yamlPropertiesFactoryBean.setResources(new ClassPathResource("datasource.yml"))
configurer.setProperties(yamlPropertiesFactoryBean.getObject())
return configurer
}
}
@Autowired
Environment env
datasource.username = env.getProperty("datasource.username")
---
spring:
profiles: development
datasource:
username: sa
password:
databaseUrl: jdbc:h2:mem:tests
databaseDriver: org.h2.Driver
我可以从Application.groovy使用调试器检查我的ApplicationContext,并确认我的PropertySourcesPlaceHolderConfigureer
存在并且加载了值。正在检查ApplicationContext.Environment.PropertySources
它不在那里。
我错过了什么?
使用PropertySourcesPlaceHolderConfigureer
不会向环境
添加属性。在配置类的类级别上使用类似@PropertySource(“classpath:something.properties”)
的东西将向Environment
添加属性,但遗憾的是,这不适用于YAML
-文件。
因此,您必须手动将从YAML
文件中读取的属性添加到环境
中。这里有一种方法可以做到这一点:
@Bean
public PropertySourcesPlaceholderConfigurer config(final ConfigurableEnvironment confenv) {
final PropertySourcesPlaceholderConfigurer configurer = new PropertySourcesPlaceholderConfigurer();
final YamlPropertiesFactoryBean yamlProperties = new YamlPropertiesFactoryBean();
yamlProperties.setResources(new ClassPathResource("datasource.yml"));
configurer.setProperties(yamlProperties.getObject());
confenv.getPropertySources().addFirst(new PropertiesPropertySource("datasource", yamlProperties.getObject()));
return configurer;
}
使用此代码,您可以以以下两种方式中的任何一种注入属性:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = PropertiesConfiguration.class)
public class ConfigTest {
@Autowired
private Environment environment;
@Value("${datasource.username}")
private String username;
@Test
public void props() {
System.out.println(environment.getProperty("datasource.username"));
System.out.println(username);
}
}
使用问题中提供的属性,这将打印“sa”两次。
编辑:现在似乎并不实际需要PropertySourcesPlaceHolderConfigureer
,因此可以将代码简化为如下所示,并且仍然生成相同的输出。
@Autowired
public void config(final ConfigurableEnvironment confenv) {
final YamlPropertiesFactoryBean yamlProperties = new YamlPropertiesFactoryBean();
yamlProperties.setResources(new ClassPathResource("datasource.yml"));
confenv.getPropertySources().addFirst(new PropertiesPropertySource("datasource", yamlProperties.getObject()));
}
编辑2:
@Autowired
public void config(final ConfigurableEnvironment confenv) {
final YamlPropertiesFactoryBean yamlProperties = new YamlPropertiesFactoryBean();
yamlProperties.setResources(new ClassPathResource("datasource-" + confenv.getActiveProfiles()[0] + ".yml"));
confenv.getPropertySources().addFirst(new PropertiesPropertySource("datasource", yamlProperties.getObject()));
}
@Autowired
public void config (final ConfigurableEnvironment confenv) {
final YamlPropertySourceLoader yamlPropertySourceLoader = new YamlPropertySourceLoader();
try {
final PropertySource<?> datasource =
yamlPropertySourceLoader.load("datasource",
new ClassPathResource("datasource.yml"),
confenv.getActiveProfiles()[0]);
confenv.getPropertySources().addFirst(datasource);
} catch (final IOException e) {
throw new RuntimeException("Failed to load datasource properties", e);
}
}
在Spring Boot中,我知道我可以替换应用程序。属性与应用程序。yml并使用YAML格式。然而,我的申请。yml越来越拥挤了,所以我需要把它分开一点。我该怎么做?我想这样做:
问题内容: 我只是想知道,是否有可能同时将多个项目导入Eclipse。因为每当创建新工作区时,都必须将所需的项目从旧工作区导入到新创建的工作区中。 因此,很高兴知道是否存在同时导入多个项目的选项? 谢谢。 问题答案: 如果所有旧项目都存在于单个目录或单个父目录中,则可以执行 File- > Import …-> Existing Projects intoworkspace 。选择一个根目录,该目
我有一个使用Spring引导的Spring批处理作业,它有2个数据源。每个数据源也有2个架构。我需要为这两个数据源指定默认模式。我知道属性spring.jpa.properties.hibernate.default_schema我使用它来指定一个数据源的默认模式。有没有办法为另一个模式指定默认模式? 目前,要为其他数据源指定默认模式,我使用更改会话查询来根据需要切换模式。我试图摆脱这个改变会话查
调用配置 我在构造函数中得到了一个NullPointerException。
用PySimpleGUI一次可以选择多个文件路径吗 只能选择一个文件 null 没有循环模式的多个文件的任何API?
在所有的例子代码中,我们在引导过程中通过 handler() 或childHandler() 都只添加了一个 ChannelHandler 实例,对于简单的程序可能足够,但是对于复杂的程序则无法满足需求。例如,某个程序必须支持多个协议,如 HTTP、WebSocket。若在一个 ChannelHandle r中处理这些协议将导致一个庞大而复杂的 ChannelHandler。Netty 通过添加多