Spring Boot 的新手。
在尝试从 @ComponentScan
中排除一个 bean 时,令我惊讶的是从 @EnableAutoConfiguration
中发现非常灵活的排除选项。
据我了解,@Configuration
继承自 @Component
。
所以,
- 为什么我必须从
@EnableAutoConfiguration
中删除配置,为什么不从@ComponentScan
中删除配置。 - 我们有
ASSIGNABLE_TYPE/REGEX/etc
。在排除。那么,为什么我们仍然需要@ComponentScan
中的excludeFilters
。
彼此之间是否存在任何限制?如果我们在这些排除项之间切换是否是一种糟糕的做法?
有人可以在这里澄清一下吗。
最佳答案
@ComponentScan
和@EnableAutoConfiguration
用于初始化 spring 应用程序上下文的不同阶段。
@ComponentScan
- 用于扫描候选 bean,spring 将搜索各种注释,如@Component
、@Configuration
等,以及拿bean候选人。这是 Spring 的特性。@EnableAutoConfiguration
- 用于扫描自动配置候选者,spring 将搜索标记为自动配置的配置并从中加载 bean 候选者。这是 spring boot 的特性。
自动配置候选可以用@ComponentScan
注解来加载候选bean,但通常自动配置模块会更精确并使用@Import
或特殊注释。在您的 spring-boot 项目中,您应该有一个用 @SpringBootApplication
注释的类,它同时执行 @ComponentScan
和 @EnableAutoConfiguration
。这将触发这两个功能并执行以下操作:
- 从您的模块中加载所有带有
@SpringBootApplication
注释的候选 bean - 搜索在类路径中加载的自动配置模块
- 尝试加载自动配置模块
- 尝试从您的自动配置模块加载候选 bean
当您从 @ComponentScan
中排除某些内容时,它会被排除在特定的 @ComponentScan
注释和过程的范围之外,无论它是您的模块还是自动 -您创建的配置模块。
当您从 @EnableAutoConfiguration
中排除某些内容时,您试图排除一个自动配置候选者。另请注意,您不能使用此注释排除正常的 @Configuration
,只能排除自动配置候选对象。
关于java - @ComponentScan 中的 excludeFilters 与 @EnableAutoConfiguration 中的排除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56081647/