Spring的@ComponentScan注解用法介绍
作者:IT技术分享社区
1、@ComponentScan注解的作用
@ComponentScan注解一般和@Configuration注解一起使用,主要的作用就是定义包扫描的规则,然后根据定义的规则找出哪些需类需要自动装配到spring的bean容器中,然后交由spring进行统一管理。
说明:针对标注了@Controller、@Service、@Repository、@Component 的类都可以别spring扫描到。
2、@ComponentScan注解属性介绍
1 value
指定要扫描的包路径
2 excludeFilters(排除规则)
excludeFilters=Filter[] 指定包扫描的时候根据规则指定要排除的组件
3 includeFilters(包含规则)
includeFilters =Filter[] 指定包扫描的时候根据规则指定要包含的组件.
注意:要设置useDefaultFilters = false(系统默认为true,需要手动设置) includeFilters包含过滤规则才会生效。
4 FilterType属性
- FilterType.ANNOTATION:按照注解过滤
- FilterType.ASSIGNABLE_TYPE:按照给定的类型,指定具体的类,子类也会被扫描到
- FilterType.ASPECTJ:使用ASPECTJ表达式
- FilterType.REGEX:正则
- FilterType.CUSTOM:自定义规则
useDefaultFilters: 配置是否开启可以对加@Component,@Repository,@Service,@Controller注解的类进行检测, 针对Java8 语法可以指定多个@ComponentScan,Java8以下可以用 @ComponentScans() 配置多个规则
3、示例
1 各种过滤过滤规则示例
// includeFilters 用法 包含Animal.class类可以被扫描到,包括其子类 @ComponentScan(value = "com.spring" includeFilters = {@ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, classes = {Animal.class} )} ) // excludeFilters 用法 排除包含@Controller注解的类 @ComponentScan(value = "com.spring" , excludeFilters = { @ComponentScan.Filter(type = FilterType.ANNOTATION , classes = {Controller.class} ), }) // ComponentScans用法 @ComponentScans( value = { @ComponentScan(value = "com.spring" , includeFilters = { @ComponentScan.Filter(type = FilterType.ANNOTATION , classes = {Controller.class} ) }, useDefaultFilters = false) , @ComponentScan(value = "com.spring" , excludeFilters = { @ComponentScan.Filter(type = FilterType.ANNOTATION , classes = { Repository.class} ) }) } )*/ // @ComponentScan // 针对Java8 语法可以指定多个@ComponentScan,Java8以下可以用 //@ComponentScans() 配置多个规则 @ComponentScan(value = "com.spring" , excludeFilters = { @ComponentScan.Filter(type = FilterType.ANNOTATION , classes = {Controller.class, Controller.class} ), }, includeFilters = { @ComponentScan.Filter(type = FilterType.ANNOTATION , classes = {Controller.class, Controller.class} ), })
2 自定义过滤规则 需要新建 TestTypeFilter.java
package com.spring.config; import org.springframework.core.io.Resource; import org.springframework.core.type.AnnotationMetadata; import org.springframework.core.type.ClassMetadata; import org.springframework.core.type.classreading.MetadataReader; import org.springframework.core.type.classreading.MetadataReaderFactory; import org.springframework.core.type.filter.TypeFilter; import java.io.IOException; /** * metadataReader 读取到当前正在扫描的类信息 * metadataReaderFactory 可以获取到其他任何类的信息 */ public class TestTypeFilter implements TypeFilter { public boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory) throws IOException { //获取当前类注解信息 AnnotationMetadata annotationMetadata = metadataReader.getAnnotationMetadata(); // 获取当前正在扫描的类信息 ClassMetadata classMetadata = metadataReader.getClassMetadata(); // 获取当前类资源信息(比如类的文件路径) Resource resource = metadataReader.getResource(); String className = classMetadata.getClassName(); System.out.println("类名:" + className); if (className.contains("controller")) { return true; } else { return false; } } }
3 新建测试类 TestComponentScan.java
package com.spring.test; import com.spring.config.TestComponentScanConfig; import org.springframework.context.annotation.AnnotationConfigApplicationContext; public class TestComponentScan { public static void main(String[] args) { AnnotationConfigApplicationContext annotationContext = new AnnotationConfigApplicationContext(TestComponentScanConfig.class); String[] names = annotationContext.getBeanDefinitionNames(); for (String name : names) { System.out.println(name); } } }
具体的运行效果可以查看控制台输出结果,是否和预期的一样,具体有不清楚的欢迎沟通交流。
到此这篇关于Spring的@ComponentScan注解用法介绍的文章就介绍到这了,更多相关@ComponentScan注解内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!