我正在尝试使用 Spring Boot 自动配置功能并遇到问题。我创建了一个 github 存储库,以便能够轻松地重现“问题”:https ://github.com/clembo590/spring-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 ?(我期待它不会像本Negative matches
节中那样)。
第三个问题:为什么fake
仍然注册为bean(我原以为fake
不会注册,甚至没有实例化......)
第四个问题:为什么MyClass
没有注册为bean?
现在,如果您删除,@ComponentScan(basePackageClasses = MyClass.class)
那么所有这些问题都会像CleaningAutoConfiguration
进入Positive matches
部分一样消失,但会创建一个新问题:
第五个问题:为什么删除 @ComponentScan 会CleaningAutoConfiguration
带入Positive matches
section ?(也许问题 5 与问题 1 有某种联系......?)