Spring 之 @Component 和 @ComponentScan 注解用法介绍和注意事项
本文将了解到:
Component 是什么?
ComponentScan 是什么?
为什么 ComponentScan 很重要?
项目中 Spring Boot 会对哪些包自动执行扫描(Component Scan)?
如何利用 Spring Boot 定义扫描范围?
@Component and @ComponentScan 的区别
1.@Component
@Component 被称为元注释,它是 @Repository、@Service、@Controller、@Configuration 的父类,理论上可以使用 @Component 来注释任何需要 Spring 自动装配的类。
主要作用是:
将普通 JavaBean 注入到 spring 容器中,Spring 容器统一管理,用起来不用自己 new 了,相当于配置文件中的
<bean id="" class=""/>
2.@ComponentScan
@ComponentScan 注解一般用在 Spring 项目的核心配置类,或者在 Spring Boot 项目的启动类里使用。相当于配置文件中的 <context:component-scan>
标签。
主要作用是:
用于完成组件扫描,指定 spring 扫描范围,通过它指定的路径,Spring 会从被指定的包及其下级包扫描 @Component 及其子类注释的类,用于 Spring 容器自动装配,也就是告诉 Spring 从哪里找到 bean。
不过需要注意,其仅仅是指定了要扫描的包,并没有装配其中的类,这个真正装配这些类是 @EnableAutoConfiguration 完成的。
3.@ComponentScan 的使用
在 SpringBoot 项目的启动类中通常使用了标签 @SpringBootApplication,而它是一个组合注解,其中就包含 @ComponentScan 注解。因此 SpringBoot 启动时会自动帮你把 app 启动类所在包及其下级包都扫描了。
举个例子:
TyhApplication 类在 com.abc 包下,并且使用 @SpringBootApplication 标签,该标签定义了 spring 将自动扫描 com.abc 及其子类包下的全部标有 @Component 注解 的类,并注册成 bean。
我们可以通过 basePackages 等属性来细粒度的定制 @ComponentScan 自动扫描的范围,如果不指定,则默认 Spring 框架实现会从声明 @ComponentScan 所在类的 package 进行扫描。
@ComponentScan 扫描可以分为两种情况:
1.如果你定义的类在 com.abc 包下,则不需要额外操作。
2.假如你定义的类不再在 com.abc 包下(比如 com.tyh),但需要被扫描到,则需要显示的使用 @ComponentScan 标签,重新指定扫瞄范围,有两种方法实现。
1.提级扫描范围
将包路径扩大到公共父路径下。
2.直接指定需要扫描路径
特别注意的是如果显示的使用 @ComponentScan 指定扫描路径,则 springboot 启动只会扫描指定的路径。比如 2 中若只定义了 com.abc,则扫描时只会扫描 com.tyh,不会扫描 com.abc,@SpringBootApplication 中包含的 @ComponentScan 失效。
4.@Component and @ComponentScan 的区别
@Component 标记了,哪些类需要被扫描,@ComponentScan 指定了哪些包路径下的标记类可以被扫描;(前者关注具体类,后者关注包路径)
评论