spring @AutoConfiguration在用户定义的bean之前运行

vngu2lb8  于 2023-04-10  发布在  Spring
关注(0)|答案(2)|浏览(197)

我在一些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之前加载。
我将感谢任何意见,解释这种行为。谢谢!

fjaof16o

fjaof16o1#

当你使用@AutoConfiguration时,Sping Boot 会为AutoConfiguration类生成一个带有proxyBeanMethods = false的代理。这意味着AutoConfiguration类中的任何@Bean方法都不会被代理拦截,而是会被直接调用。因此,当你在客户端模块的UserConfiguration类中定义一个同名的bean时,它被忽略,因为Sping Boot 将使用AutoConfiguration类中的bean定义。
要确保UserConfiguration类中的bean具有优先级,可以向AutoConfiguration和UserConfiguration类的@Bean方法添加@ConditionalOnMissingBean注解。

zqry0prt

zqry0prt2#

我刚刚想明白了starter配置中有另一个bean通过方法签名调用第一个bean:

@AutoConfiguration
public class AutoConfiguration {
    @Bean
    @ConditionalOnMissingBean
    public SomeBeanInterface someBean() {
        return new DefaultBean();
    }
    
    @Bean
    public SomeSecondBean secondBean() {
        return new SomeSecondBean(someBean())
    }
}

我刚把它改成:

@Bean
    public SomeSecondBean secondBean(SomeBeanInterface 
 someBean) {
        return new SomeSecondBean(someBean)
    }

一切都很顺利

相关问题