我在一些starter中有一个autoconfigure模块,配置如下:
@Configuration
public class AutoConfiguration {
@Bean
@ConditionalOnMissingBean
public SomeBeanInterface someBean() {
return new DefaultBean();
}
}
使用它的客户端模块有一个,其中包含一个自定义bean:
@Configuration
public class UserConfiguration {
@Bean
public SomeBeanInterface someBean() {
return new CustomBean();
}
}
一切正常,Spring使用自定义bean而不是default。但是,如果我在starter模块中使用@AutoConfiguration而不是常规的@Configuration(如当前spring Boot docs所推荐的),那么Spring将选择默认bean。
据我所知,发生这种情况是因为@AutoConfiguration中的“proxyBeanMethods = false”。但我有点困惑,正如文档所述:“auto-configuration classes are guaranteed to load after any user-defined bean definitions have been added”因此,根据我的理解,Spring应该选择Custom bean,因为它应该在autoconfiguration class之前加载。
我将感谢任何意见,解释这种行为。谢谢!
2条答案
按热度按时间fjaof16o1#
当你使用
@AutoConfiguration
时,Sping Boot 会为AutoConfiguration类生成一个带有proxyBeanMethods = false
的代理。这意味着AutoConfiguration类中的任何@Bean方法都不会被代理拦截,而是会被直接调用。因此,当你在客户端模块的UserConfiguration类中定义一个同名的bean时,它被忽略,因为Sping Boot 将使用AutoConfiguration类中的bean定义。要确保UserConfiguration类中的bean具有优先级,可以向AutoConfiguration和UserConfiguration类的
@Bean
方法添加@ConditionalOnMissingBean
注解。zqry0prt2#
我刚刚想明白了starter配置中有另一个bean通过方法签名调用第一个bean:
我刚把它改成:
一切都很顺利