马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
@ComponentScan注解详解:Spring组件扫描的焦点机制
一、@ComponentScan注解概述
@ComponentScan是Spring框架中的一个焦点注解,用于主动扫描和注册指定包及其子包下的Spring组件。它是Spring实现依赖注入和主动装配的根本机制之一。- @Retention(RetentionPolicy.RUNTIME)
- @Target(ElementType.TYPE)
- @Documented
- @Repeatable(ComponentScans.class)
- public @interface ComponentScan {
- // 配置参数
- }
复制代码 二、根本使用方式
1. 最简朴的使用情势
- @Configuration
- @ComponentScan
- public class AppConfig {
- // 不指定basePackages时,默认扫描当前配置类所在包及其子包
- }
复制代码 2. 指定扫描的根本包
- @Configuration
- @ComponentScan(basePackages = "com.example.service")
- public class AppConfig {
- // 只扫描com.example.service包及其子包
- }
复制代码 3. 指定多个根本包
- @Configuration
- @ComponentScan(basePackages = {"com.example.service", "com.example.dao"})
- public class AppConfig {
- // 扫描多个包
- }
复制代码 4. 通过类指定根本包
- @Configuration
- @ComponentScan(basePackageClasses = {UserService.class, UserDao.class})
- public class AppConfig {
- // 扫描这些类所在的包及其子包
- }
复制代码 三、高级设置选项
1. 包罗/扫除特定组件
- @Configuration
- @ComponentScan(
- basePackages = "com.example",
- includeFilters = @Filter(type = FilterType.ANNOTATION, classes = Repository.class),
- excludeFilters = @Filter(type = FilterType.REGEX, pattern = ".*Test.*")
- )
- public class AppConfig {
- // 包含Repository注解的类,排除类名包含Test的类
- }
复制代码 2. 过滤器范例(FilterType)
- ANNOTATION:基于注解过滤(默认)
- ASSIGNABLE_TYPE:基于类或接口过滤
- ASPECTJ:使用AspectJ表达式
- REGEX:使用正则表达式
- CUSTOM:自界说过滤器
3. 自界说过滤器
- public class MyTypeFilter implements TypeFilter {
- @Override
- public boolean match(MetadataReader metadataReader,
- MetadataReaderFactory metadataReaderFactory) {
- // 自定义过滤逻辑
- return metadataReader.getClassMetadata().getClassName().contains("Service");
- }
- }
- @Configuration
- @ComponentScan(
- basePackages = "com.example",
- includeFilters = @Filter(type = FilterType.CUSTOM, classes = MyTypeFilter.class)
- )
- public class AppConfig {
- }
复制代码 四、@ComponentScans注解
从Spring 4.3开始,可以使用@ComponentScans来组合多个@ComponentScan:- @Configuration
- @ComponentScans({
- @ComponentScan(basePackages = "com.example.service"),
- @ComponentScan(basePackages = "com.example.dao")
- })
- public class AppConfig {
- }
复制代码 五、与@SpringBootApplication的关系
在Spring Boot应用中,@SpringBootApplication注解已经包罗了@ComponentScan的功能:- @Target(ElementType.TYPE)
- @Retention(RetentionPolicy.RUNTIME)
- @Documented
- @Inherited
- @SpringBootConfiguration
- @EnableAutoConfiguration
- @ComponentScan
- public @interface SpringBootApplication {
- // ...
- }
复制代码 六、常见标题与最佳实践
1. 性能思量
- 扫描范围不宜过大,只管准确指定须要扫描的包
- 克制重复扫描雷同的包
2. 与XML设置的协同工作
可以通过<context:component-scan>在XML中实现雷同功能,或与注解设置肴杂使用
3. 组件扫描的底层机制
Spring通过ClassPathBeanDefinitionScanner类实现组件扫描功能,扫描过程紧张包罗:
- 根据设置确定扫描路径
- 使用资源模式分析器查找类文件
- 应用包罗/扫除过滤器
- 注册符合条件的Bean界说
七、实际应用示例
1. 多模块项目中的组件扫描
- // 主配置类
- @Configuration
- @ComponentScan(basePackages = {
- "com.example.module1",
- "com.example.module2"
- })
- public class MainConfig {
- }
- // 模块专用配置类
- @Configuration
- @ComponentScan(basePackages = "com.example.module1.service")
- public class Module1ServiceConfig {
- }
复制代码 2. 条件化组件扫描
- @Configuration
- @ComponentScan(
- basePackages = "com.example",
- includeFilters = @Filter(
- type = FilterType.CUSTOM,
- classes = {ProfileBasedFilter.class}
- ),
- useDefaultFilters = false
- )
- @Conditional(DevProfileCondition.class)
- public class DevConfig {
- }
复制代码 八、总结
@ComponentScan是Spring框架中实现主动装配的焦点机制之一,公道使用可以大大简化Spring应用的设置工作。把握其各种设置选项和过滤机制,可以或许资助我们更机动地控制Spring容器的组件注册过程,构建更加模块化和可维护的应用步调。
|