我想创建不同的数据库配置文件类,每个类都用于开发,生产和测试。
我在http://spring.io/blog/2011/02/14/spring-3-1-m1-introducing-profile/的帮助下尝试了以下操作,但它没有正确接线。为什么呢?
interface DataConfig {
DataSource dataSource();
}
@Configuration
@Profile("dev")
public class StandaloneDataConfig implements DataConfig {
@Bean
@Override
public dataSource dataSource() {
//return the ds
}
}
@Configuration
@Profile("prod")
public class JndiDataConfig implements DataConfig { ... }
@Configuration
@PropertySource({"classpath:config.properties"})
class AppConfig {
@Autowired
private DataConfig cfg;
}
@Configuration
@ComponentScan
@Import(AppConfig.class)
@EnableTransactionManagement
public class SpringBootConfig extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(Application.class);
}
}
config.properties:
spring.profiles.active=dev
结果:启动时出现异常
Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: private DataConfig dataConfig; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [DataConfig] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:508)
at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:87)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:289)
... 34 common frames omitted
Spring 4.0.3.RELEASE
我的设置似乎总体上起作用:如果我删除其中一个数据库上的@Profile注释,一切都正确连接。
答案 0 :(得分:1)
您需要将config.properties
文件重命名为application.properties
,以便Spring Boot自动选择它。
答案 1 :(得分:0)
我还没有对您的配置进行测试,但我最好的猜测(我已经为this post做了一些调查)是@PropertySources
无法用于@Conditional
自动装配发生时带注释的@Configuration
类。
根据source code,@Profile
是一种@Conditional
注释风格,带有Condition
实现。
要求@PropertySource
在需要时可用,我认为您需要自己的自定义@Conditional
实施,就像我在上面提到的SO帖子中那样,您定义的不是Condition
而是ConfigurationCondition
{1}}确保在ConfigurationPhase.REGISTER_BEAN
阶段使用。