我正在尝试使用@Bean方法而不是@Import创建一个导入另一个Config的MainConfig,如下所示:
@Configuration
public class MainConfig {
@Bean
public Service service() {
return new Service(infrastructureConfig().database());
}
@Bean
public OtherService otherService() {
return new OtherService(infrastructureConfig().database());
}
@Bean
public InfrastructureConfig intrastructureConfig() {
return new InfrastructureConfig();
}
}
@Configuration
public class InfrastructureConfig {
@Bean
public Database database() {
return new Database();
}
...
}
使用此技术时,数据库创建两次,因为Spring似乎没有考虑InfrastructureConfig上的@Configuration注释。使用@Import时,它可以正常工作。
我不想使用@Import,因为我想像这样模拟我的InfrastructureConfig:
@Configuration
public class TestConfig extends MainConfig {
@Override
public InfrastructureConfig infrastructureConfig() {
return mock(InfrastructureConfig.class);
}
}
我错过了什么或不支持吗?
由于
答案 0 :(得分:0)
当我第一次尝试Spring Java配置时,我认为我做了同样的假设,并且在它不起作用时感到惊讶。
我不确定这是解决此问题的最佳方法,但我已成功使用以下方法。
要包含该@Configuration类,您可以将此注释添加到MainConfig
:
@ComponentScan(basePackages = "org.foo", includeFilters = {@Filter(filterType = ANNOTATION, value = CONFIGURATION)}, excludeFilters = {@Filter(filterType = ASSIGNABLE_TYPE, value = MainConfig)})
由于@Configuration类也是组件扫描的候选者,因此您可以扫描所有使用@Configuration注释的类。由于您要在MainConfig
上添加此注释,因此您需要使用ASSIGNABLE_TYPE过滤器将其排除,因为您将获得循环引用。
答案 1 :(得分:0)
我开了一张春季门票SpringSource JIRA,他们说这是一个已知的限制,它按设计工作。