spring容器通过@componentscan扫描指定路径下被@component及其衍生注解标记的类,解析字节码生成beandefinition并注册到beanfactory,默认扫描主配置类所在包及子包。

Spring 容器通过 @ComponentScan 配合 @Component 及其衍生注解(如 @Service、@Repository、@Controller)实现自动扫描和注册组件,核心在于“扫描路径 + 注解识别 + Bean 定义注册”三步联动。
扫描范围由 @ComponentScan 明确指定
容器启动时,Spring 会读取配置类或 XML 中的扫描指令,决定从哪开始找组件:
- 不写参数时,默认扫描 @ComponentScan 所在配置类所在的包及其子包
- 用 value 或 basePackages 指定具体包名,例如
@ComponentScan("com.example.service") - 用 basePackageClasses 更安全——传入一个类(如
UserService.class),Spring 自动取该类所在包作为扫描起点
哪些类会被识别为组件?
只有被 Spring 认可的注解标记的类才会被纳入扫描结果:
- @Component(通用组件)
- @Service(业务逻辑层)
- @Repository(数据访问层)
- @Controller(Web 控制层)
- 任何被
@Component元注解修饰的自定义注解(如@MyService)
注意:仅加注解还不够,必须落在 @ComponentScan 覆盖的包路径内,否则不会被发现。
扫描过程由 ClassPathScanningCandidateComponentProvider 执行
底层实际调用的是 Spring 的类路径扫描器,它会:
- 遍历 classpath 下所有匹配路径的 .class 文件
- 读取每个类的注解元数据(不加载类,只解析字节码)
- 根据过滤规则(默认启用
useDefaultFilters = true)判断是否保留该类 - 将符合条件的类封装为
BeanDefinition,注册进 BeanFactory
常见配置方式对比
XML 方式(传统):
Java 配置方式(主流):
@Configuration@ComponentScan("com.example")
public class AppConfig { }
如果项目使用 Spring Boot,通常只需在主启动类上加 @SpringBootApplication(它本身已组合了 @ComponentScan,默认扫描主类所在包及子包)。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











