@ComponentScan中的excludeFilters与@EnableAutoConfiguration中的exclude

时间:2019-05-10 16:37:59

标签: java spring-boot

Spring Boot的新手。

在尝试从@ComponentScan中排除bean时,令我惊讶的是发现从@EnableAutoConfiguration中非常灵活的排除选项。

据我所知,@Configuration是从@Component继承的。

所以

  1. 为什么我必须从@EnableAutoConfiguration中删除配置,为什么不从@ComponentScan中删除。
  2. 我们有ASSIGNABLE_TYPE/REGEX/etc。在排除。那么为什么我们仍然需要excludeFilters中的@ComponentScan

彼此之间是否有限制,如果我们在这些排除项之间切换是不好的做法吗?

有人可以在这里澄清。

1 个答案:

答案 0 :(得分:0)

@ComponentScan@EnableAutoConfiguration用于初始化spring应用程序上下文的不同阶段。

  1. @ComponentScan-用于扫描bean候选对象,spring将搜索各种注释,例如@Component@Configuration等,并获取bean候选对象。这是弹簧的功能。
  2. @EnableAutoConfiguration-用于扫描自动配置候选者,spring将搜索标记为自动配置的配置并从中加载Bean候选者。这是弹簧靴的功能。

可以使用@ComponentScan注释自动配置候选者以加载bean候选者,但是通常是自动配置模块的模块会更精确,并使用@Import或特殊注释。在spring-boot项目中,您应该有一个用@SpringBootApplication注释的类,该类同时执行@ComponentScan@EnableAutoConfiguration。这将触发两个功能并执行以下操作:

  1. 从模块中加载所有用@SpringBootApplication注释的bean候选对象
  2. 搜索类路径中加载的自动配置模块
  3. 尝试加载自动配置模块
  4. 尝试从自动配置模块中加载bean候选对象

如果您从@ComponentScan中排除某些内容,则将其排除在特定的@ComponentScan注释和过程的范围之外,无论是您的模块还是您创建的自动配置模块。

@EnableAutoConfiguration中排除某些内容时,您尝试排除自动配置候选对象。另外请注意,您不能使用此注释排除普通的@Configuration,只能排除自动配置的候选对象。