@ComponentScan 与 <context:component-scan /> 之间的联系与区别

AUTHOR | nicechi
类别 | Spring
发表 | 2019-09-19 08:17:18
更新 | 2020-08-05 21:27:59

@ComponentScan

@ComponentScan 经常与@Configuration 一起使用,其主要作用就是用来扫描指定的 package 或指定的 class,然后自动将使用有 @Component@Service@Controller或者 @Repository 的类注册成为 bean,然后激活这些 bean中所使用到的注解(如 @Autowired 或者 @Qualified 等)。

其所发挥的作用与 <context:component-scan /> 的作用基本一样。

@ComponentScan 最经常使用的属性就是 basePackageClasses 和 basePackages 。basePackageClasses 用来指定将要扫描的类,而不是指定将要扫描的 package ,相较于 basePackages 来说,它是 type-safe(类型安全) 的。basePackages 用来指定将要扫描的 package,不用像 basePackageClasses 那样需要一个个去扫描指定的类,适合有大量类需要扫描的情况。如果这两个属性都没有指定值的话,它会自动从当前类(即使用有 @ComponentScan 的类)所在的路径开始,向下开始扫描(也就是继续扫描当前类所在的路径下的所有子路径,然后一直循环迭代下去)。

@Configuration
@ComponentScan(basePackages = {" ... "})
public class ApplicationConfiguration {
   ...
   配置信息
   ...
}

<context:component-scan />

<context:component-scan />@ComponentScan 所发挥的作用基本上一样,主要的不同之处就是 <context:component-scan /> 不能扫描指定的类,而且它需要用在 xml 配置文件中。

<beans>
   <context:component-scan base-package=" ... " />
</beans>

相较于 @ComponentScan,<context:component-scan /> 所拥有的属性 base-package 就相当于 @ComponentScan 的 basePackages,但是 <context:component-scan /> 拥有一个 @ComponentScan 所没有的属性:annotation-config,此属性的作用是用来开启或关闭 annotation-config(即 <context:annotation-config /> 所发挥的功能,用来激活所注册 bean 中的注解(如 @Autowired 或者 @Qualified 等),关于 <context:annotation-config /> 的相关内容,请移步 <context:annotation-config /> 与 <context:component-scan /> 与 <mvc:annotation-driven /> 之间的联系与区别

联系与区别

@ComponentScan<context:component-scan /> 都可以扫描指定的位置(@ComponentScan 和 <context:component-scan /> 分别使用 basePackagesbase-package 来指定所要扫描的包,除此之外,@ComponentScan 还可以使用 basePackageClasses来指定所要扫描的类,而 <context:component-scan /> 不可以扫描指定的类),然后将所扫描到的使用有 @Component 、@Service、@Controller 或者 @Repository 的类注册成为 bean,然后激活这些 bean 中所使用到的注解(如 @Autowired 或者 @Qualified 等)

<context:component-scan /> 拥有一个属性 annotation-config,此属性的作用是用来开启或关闭 annotation-config(即 <context:annotation-config /> 所发挥的功能,用来激活所注册 bean 中的注解(如 @Autowired 或者 @Qualified 等),也就是说如果将 annotation-config 属性的值设为 false 的话,<context:component-scan /> 所发挥的作用将仅仅是将使用有 @Component 、@Service、@Controller 或者 @Repository 的类注册成为 bean,而不会像原先那样去激活这些被注册的 bean 中的注解(如 @Autowired 或者 @Qualified 等)。

但是在 @ComponentScan 中却没有 annotation-config 属性,也就是说 @ComponentScan 是默认开启 annotation-config 功能的,官方 API 所给出的原因经过整理可以得出如下两点原因:

  1. 一方面,当你使用 @ComponentScan 注解时,你有很大的概率是要使用诸如 @Autowired 或者 @Qualified 等的注解的,所以 annotation-config 在很大概率上是需要被使用到的
  2. 另一方面,当你使用 @ComponentScan 注解时,是需要通过 AnnotationConfigApplicationContext(或者 AnnotationConfigWebApplicationContext) 来创建 Spring 的 ApplicationContext ,而在使用  AnnotationConfigApplicationContext(或者 AnnotationConfigWebApplicationContext)时, annotation config 的 processor(处理器)是总是被注册的,所以即便你在 @ComponentScan 上禁止 annotation-config 功能,那也是无用功

 

最后,希望这篇文章能带给你点启发,Have Fun!


CATEGORY

TOP