ComponentScan的作用:指定要扫描的包

直接用代码说话吧!

操作:新建cap2文件夹,新建Cap2MainConfig.java配置类

Spring源码分析(二)-注解ComponentScan_spring

1,@ComponentScan(value="com.caojiulu.cap2")表示扫描此目录下的包

测试:

Spring源码分析(二)-注解ComponentScan_spring_02

新建Cap2MainConfig2配置类

新建dao, service,controller

在Cap2MainConfig2加入配置: @Filter: 扫描规则

 @ComponentScan(value="com.caojiulu.cap2",includeFilters={ @Filter(type=FilterType.ANNOTATION,classes={Controller.class}), @Filter(type=FilterType.ASSIGNABLE_TYPE,classes={Cap2Service.class})

},useDefaultFilters=false) //默认是true,扫描所有组件,要改成false,使用自定义扫描范围

*/

//@ComponentScan value:指定要扫描的包

//excludeFilters = Filter[] 指定扫描的时候按照什么规则排除那些组件

//includeFilters = Filter[] 指定扫描的时候只需要包含哪些组件

//useDefaultFilters = false 默认是true,扫描所有组件,要改成false

//----扫描规则如下

//FilterType.ANNOTATION:按照注解

//FilterType.ASSIGNABLE_TYPE:按照给定的类型;比如按BookService类型

//FilterType.ASPECTJ:使用ASPECTJ表达式

//FilterType.REGEX:使用正则指定

//FilterType.CUSTOM:使用自定义规则,自已写类,实现TypeFilter接口

//FilterType.CUSTOM的例子,常用

先新增自定义过滤规则类:

package com.caojiulu.cap2;

import java.io.IOException;

import org.springframework.core.type.classreading.MetadataReader;
import org.springframework.core.type.classreading.MetadataReaderFactory;
import org.springframework.core.type.filter.TypeFilter;

public class JiuluTypeFilters implements TypeFilter{

/**
* metadataReader: 读取到当前正在扫描的类信息
* metadataReaderFactory :
*/
public boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory) throws IOException {
// TODO Auto-generated method stub
String className = metadataReader.getClassMetadata().getClassName();
System.out.println("---->"+className);
if(className.contains("jiulu11")){ //当类名包含jiulu11 --则匹配成功
return true;
}
return false;
}

}