写点什么

Spring 之 @Component 和 @ComponentScan 注解用法介绍和注意事项

作者:echoes
  • 2022 年 5 月 30 日
  • 本文字数:1423 字

    阅读完需:约 5 分钟

Spring之 @Component和@ComponentScan注解用法介绍和注意事项

本文将了解到:

  1. Component 是什么?

  2. ComponentScan 是什么?

  3. 为什么 ComponentScan 很重要?

  4. 项目中 Spring Boot 会对哪些包自动执行扫描(Component Scan)?

  5. 如何利用 Spring Boot 定义扫描范围?

  6. @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 启动类所在包及其下级包都扫描了。


举个例子:

package com.abc;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplicationpublic class TyhApplication {
public static void main(String[] args) { SpringApplication.run (TyhApplication.class, args); }
}
复制代码

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.提级扫描范围

@SpringBootApplication@ComponentScan(basePackages = {"com"})public class TyhApplication {
public static void main(String[] args) { SpringApplication.run (TyhApplication.class, args); }
}
复制代码

将包路径扩大到公共父路径下。

2.直接指定需要扫描路径

@SpringBootApplication@ComponentScan(basePackages = {"com.abc","com.tyh"})public class TyhApplication {
public static void main(String[] args) { SpringApplication.run (TyhApplication.class, args); }
复制代码

特别注意的是如果显示的使用 @ComponentScan 指定扫描路径,则 springboot 启动只会扫描指定的路径。比如 2 中若只定义了 com.abc,则扫描时只会扫描 com.tyh,不会扫描 com.abc,@SpringBootApplication 中包含的 @ComponentScan 失效。

4.@Component and @ComponentScan 的区别

@Component 标记了,哪些类需要被扫描,@ComponentScan 指定了哪些包路径下的标记类可以被扫描;(前者关注具体类,后者关注包路径)

用户头像

echoes

关注

探索未知,分享收获 2018.04.25 加入

还未添加个人简介

评论

发布
暂无评论
Spring之 @Component和@ComponentScan注解用法介绍和注意事项_echoes_InfoQ写作社区