【发布时间】:2016-03-13 15:07:39
【问题描述】:
我开发了一个自定义 Spring Boot 自动配置来简化使用专有消息传递库。
主要的自动配置类基本如下:
@Configuration
@ConditionalOnClass({LibServer.class, LibClient.class})
@EnableConfigurationProperties(LibProperties.class)
public class LibAutoConfiguration {
@Autowired
LibProperties props;
@Bean
@ConditionalOnMissingBean(LibServer.class)
public LibServer lbServ() {
// create and configure a server object
}
@Bean
@ConditionalOnMissingBean(LibClient.class)
public LibClient lbClient() {
//create and configure a client object
}
}
然而,条件注释似乎没有检测到主 @SpringBootApplication 注释类中声明的 bean。
它只检测在单独的 @Configuration 注释类中声明的 bean。
也就是说,如果我在主类中放置两个 @Bean 注释方法返回一个 LibServer 和一个 LibClient 对象,我最终会得到两个 LibServer 和两个 LibClient 对象(自动配置的对象和明确声明的)在上下文中。
本机 Spring Boot 自动配置(例如 DataSource one)也可以检测在主类中声明的 bean(例如 @Bean 注释的 jdbcTemplate 方法)。
即使是在主类中声明的 bean,我如何才能正确检测 bean?
编辑
展示该行为的完整多模块 maven 项目位于 https://github.com/AlexFalappa/spring-boot-testcase
【问题讨论】:
-
你的主类是什么样的,你如何运行你的应用程序?
-
您不会自己导入
LibAutoConfiguration,是吗?自动配置类必须在spring.factories中定义,而不是直接加载。这在这种情况下很重要,因为我们需要先处理所有用户配置,然后检查是否必须创建这些 bean。 -
@StéphaneNicoll:我的自定义自动配置在一个 maven 模块中,其中包含相关的
spring.factories文件,并且还通过声明对专有消息传递库的依赖关系作为启动模块。该应用程序位于依赖于前者的不同 Maven 模块中。 -
@Morfic:主类是一个普通的 Spring Boot 应用程序,注释为
@SpringBootApplication
标签: java spring spring-boot