本文将了解到:
- 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 完成的
在SpringBoot项目的启动类中通常使用了标签@SpringBootApplication,而它是一个组合注解,其中就包含@ComponentScan注解。因此SpringBoot启动时会自动帮你把app启动类所在包及其下级包都扫描了。
举个例子:
TyhApplication类在com.abc包下,并且使用@SpringBootApplication标签,该标签定义了spring将自动扫描com.abc及其子类包下的全部标有 @Component注解 的类,并注册成bean。
我们可以通过basePackages等属性来细粒度的定制@ComponentScan自动扫描的范围,如果不指定,则默认Spring框架实现会从声明@ComponentScan所在类的package进行扫描。
有两种情况要注意:
1.如果你定义的类在com.abc包下,则不需要额外操作
2.假如你定义的类不再在com.abc包下(比如com.tyh),但需要需要被扫描到,则需要显示的使用@ComponentScan标签,重新指定扫瞄范围。
有两种方法实现,
1.扩大扫描范围
2.直接指定需要扫描路径
特别注意的是如果显示的使用@ComponentScan指定扫描路径,则springboot启动只会扫描指定的路径。比如2中若只定义了com.abc,则扫描时只会扫描com.tyh,不会扫描com.abc,@SpringBootApplication中包含的@ComponentScan失效。
@Component and @ComponentScan 的区别
@Component标记了,哪些类需要被扫描,@ComponentScan指定了哪些包路径下的标记类可以被扫描;(前者关注具体类,后者关注包路径)