今天给大家分享Spring中@ComponentScan注解的用法,希望对大家能有所帮助!
1、@ComponentScan注解的作用
@ComponentScan注解一般和@Configuration注解一起使用,主要的作用就是定义包扫描的规则,然后根据定义的规则找出哪些需类需要自动装配到spring的bean容器中,然后交由spring进行统一管理。说明:针对标注了@Controller、@Service、@Repository、@Component 的类都可以别spring扫描到。
2、@ComponentScan注解属性介绍
2.1 value指定要扫描的包路径
2.2 excludeFilters(排除规则)excludeFilters=Filter[] 指定包扫描的时候根据规则指定要排除的组件
2.3 includeFilters(包含规则)includeFilters =Filter[] 指定包扫描的时候根据规则指定要包含的组件.注意:要设置useDefaultFilters = false(系统默认为true,需要手动设置) includeFilters包含过滤规则才会生效。
2.4 FilterType属性FilterType.ANNOTATION:按照注解过滤FilterType.ASSIGNABLE_TYPE:按照给定的类型,指定具体的类,子类也会被扫描到FilterType.ASPECTJ:使用ASPECTJ表达式FilterType.REGEX:正则FilterType.CUSTOM:自定义规则useDefaultFilters: 配置是否开启可以对加@Component,@Repository,@Service,@Controller注解的类进行检测, 针对Java8 语法可以指定多个@ComponentScan,Java8以下可以用 @ComponentScans() 配置多个规则
3、示例 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 } ), })3.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.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 ); } } }
具体的运行效果可以查看控制台输出结果,是否和预期的一样,具体有不清楚的欢迎沟通交流。
原文地址:https://mp.weixin.qq.com/s/JeCIW87jn1heBHv7jadE2w
查看更多关于Spring系列之@ComponentScan注解用法介绍的详细内容...