gpt4 book ai didi

Spring 启动自动配置。意外的行为

转载 作者:行者123 更新时间:2023-12-03 08:09:54 24 4
gpt4 key购买 nike

我正在尝试使用 Spring Boot 自动配置功能,但遇到了问题。我创建了一个 github 存储库,以便能够轻松重现“问题”:

git clone https://github.com/clembo590/issues.git --branch spring_boot_auto_configuration

只需运行mvn clean install,您将获得我在描述中提到的所有日志。

我已经“启用”了 debug=true spring boot 属性来查看哪个“自动配置”已激活或未激活(如果它未激活,为什么它未激活)。

我还添加了一些日志来“记录已添加到 Spring Boot 上下文中的所有 bean”。

这是我的自动配置类。


@Configuration
@ComponentScan(basePackageClasses = MyClass.class)
@ConditionalOnBean(ObjectMapper.class)
@AutoConfigureOrder(Ordered.LOWEST_PRECEDENCE)
public class CleaningAutoConfiguration {

@Bean
public Fake fake(){
return new Fake();
}

private static class Fake{

}

}

第一个奇怪的事情是这个日志:

   CleaningAutoConfiguration:
Did not match:
- @ConditionalOnBean (types: com.fasterxml.jackson.databind.ObjectMapper; SearchStrategy: all) did not find any beans of type com.fasterxml.jackson.databind.ObjectMapper (OnBeanCondition)
Matched:
- @ConditionalOnBean (types: com.fasterxml.jackson.databind.ObjectMapper; SearchStrategy: all) found bean 'jacksonObjectMapper' (OnBeanCondition)

第一个问题:为什么 @ConditionalOnBean 既匹配又不匹配? (我对这种条件的期望是它应该匹配或不匹配......但不能两者都匹配......参见问题5)

现在,如果我们查看日志,CleaningAutoConfiguration 似乎位于 Negative matches: 部分。

第二个问题:为什么CleaningAutoConfiguration本身注册为一个bean? (我原以为它不会像负匹配部分中那样)。

第三个问题:为什么fake仍然注册为bean(我期望fake不会被注册,甚至不会实例化......)

第四个问题:为什么 MyClass 没有注册为 bean?

现在,如果您删除@ComponentScan(basePackageClasses = MyClass.class),那么所有这些问题都会消失,因为CleaningAutoConfiguration进入积极匹配部分,但创建了一个新部分:

第五个问题:为什么删除 @ComponentScan 会将 CleaningAutoConfiguration 引入 Positive matches 部分? (也许问题 5 与问题 1 有某种联系......?)

最佳答案

问题的根本原因是在自动配置类 not supported 上使用 @ComponentScan :

Furthermore, auto-configuration classes should not enable component scanning to find additional components. Specific @Imports should be used instead.

回答您的具体问题:

Why is @ConditionalOnBean BOTH matching and not matching

它首先作为考虑不受支持的 @ComponentScan 注释的一部分进行评估。此时,ObjectMapper bean 尚未定义,因此不匹配。随后在定义 ObjectMapper bean 后对其进行评估,此时它匹配。

why is CleaningAutoConfiguration itself registered as a bean ? (I was expecting it would not as it is in the Negative matches section).

由于正负匹配,该报告在这里误导了您。由于正匹配,CleaningAutoConfiguration 是一个 bean。

Why is fake still registered as a bean (I was expecting that fake would not be registered, and not even instanciated...)

该报道再次误导了您。 CleaningAutoConfiguration 上的条件已匹配,因此已定义其 Fake bean。

why is MyClass not registered as a bean

考虑 @ComponentScan 注释时,CleaningAutoConfiguration 上的条件不匹配,因此未启用 MyClass 包的组件扫描.

Why removing the @ComponentScan brings CleaningAutoConfiguration into Positive matches section

它可以防止在 ObjectMapper bean 尚未定义时过早评估 CleaningAutoConfiguration 的条件。当它们最终在预期时间被评估时,ObjectMapper bean 就存在并且条件匹配。

关于 Spring 启动自动配置。意外的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71133078/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com