Spring的组件扫描注解

通过在类上加注解 @ComponentScan 来扫描 Spring 的组件类。

@ComponentScan 的可选参数

basePackages:指定需要扫描的根包目录,其子目录也会被扫描,默认路径为 @ComponentScan 注解类目录,及其子目录

value:basePackages 的别名

basePackageClasses:指定需要扫描的根类目录,其子目录也会被扫描

lazyInit:是否懒加载,默认 false

useDefaultFilters:是否启用自动扫描组件,默认 true;false 表示只应用下面指定的过滤规则

excludeFilters:指定不需要扫描的组件类型(详见 @Filter 配置)

includeFilters:指定需要扫描的组件类型(详见 @Filter 配置)

scopedProxy:代理模式 ScopedProxyMode

DEFAULT:默认,一般就是 NO

NO:不需要创建代理

INTERFACES:创建 JDK 代理

TARGET_CLASS:利用 CGLIB 创建代理

nameGenerator:指定实现了接口 BeanNameGenerator 的类,可以用来定义 BeanName 的生成规则

scopeResolver:指定实现了接口 AnnotationScopeMetadataResolver 的类,可以配置作用域 scope,和代理模式 scopedProxy

resourcePattern:用来匹配合适的组件,默认为 **/*.class,推荐使用 includeFilters 和 excludeFilters

配置多个 @ComponentScan 的方法

下面三种方式都可以

@ComponentScans( @ComponentScan({"com.xxx.aaa","com.xxx.bbb"}) ) @Configuration public class Config {} @ComponentScan({"com.xxx.aaa","com.xxx.bbb"}) @Configuration public class Config {} @ComponentScan({"com.xxx.aaa"}) @ComponentScan({"com.xxx.bbb"}) @Configuration public class Config {} 配置过滤器 @Filter

1、过滤 @Service 注解类

@Configuration @ComponentScan( excludeFilters = { @Filter(type = FilterType.ANNOTATION, classes = Service.class) } ) public class Config {}

2、过滤 Dog 类

@Configuration @ComponentScan( excludeFilters = { @Filter(type = FilterType.ASSIGNABLE_TYPE, classes = Dog.class) } ) public class Config {}

3、正则匹配,过滤后缀为 a 的类

@Configuration @ComponentScan( excludeFilters = { @Filter(type = FilterType.REGEX, pattern = {"..*a"}) } ) public class Config {}

4、自定义过滤规则类,过滤包含 a 的类

@Configuration @ComponentScan( excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = MyFilterType.class) } ) public class Config {} // 实现 TypeFilter 自定义规则:过滤包含 a 的 BeanName public class MyFilterType implements TypeFilter 自定义规则 { @Override public boolean match(MetadataReader reader, MetadataReaderFactory factory) throws IOException { return reader.getClassMetadata().getClassName().contains("a"); } } 一个例子

配置类 Config,有如下规则:

需要扫描包路径com.xxx.aaa、com.xxx.bbb

排除com.xxx.aaa路径下的@Service注解类和Dog类

com.xxx.bbb不启用自动扫描,但是需要包含Cat类

@ComponentScan( value = {"com.xxx.aaa"}, excludeFilters = { @Filter(type = FilterType.ANNOTATION, classes = Service.class), @Filter(type = FilterType.ASSIGNABLE_TYPE, classes = Dog.class) } ) @ComponentScan( value = {"com.xxx.bbb"}, useDefaultFilters = false, includeFilters = { @Filter(type = FilterType.ASSIGNABLE_TYPE, classes = Cat.class) } ) @Configuration public class Config { }

Linux公社的RSS地址https://www.linuxidc.com/rssFeed.aspx

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/f3caef348be4ad9fa309cc383e258c6c.html