我开发了一个自定义的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
}
}
Run Code Online (Sandbox Code Playgroud)
但是,似乎条件注释不检测在主@SpringBootApplication注释类中声明的bean .
它仅检测在单独的带@Configuration注释的类中声明的bean .
也就是说,如果我放置两个带@Bean注释的方法,在主类中返回一个LibServer和一个LibClient对象,我最终会在上下文中有两个LibServer和两个LibClient对象(自动配置的对象和显式声明的对象).
本机spring引导自动配置(例如DataSource一个)也可以检测主类中声明的bean(例如带@Bean注释的jdbcTemplate方法).
即使对于在主类中声明的bean,我如何获得正确的bean检测?
编辑
一个完整的多模块maven项目展示了这种行为,请访问https://github.com/AlexFalappa/spring-boot-testcase