@Test
public void testIncludeFilters(){
ApplicationContext ac =
new AnnotationConfigApplicationContext(AppConfig.class);
我们会发现spring会将有标注注解的Person类和我们有我们自定义注解的Dog都加载。
[2]ASSIGNABLE_TYPE:指定扫描某个接口派生出来的类
我们修改上面的案例,添加一个接口Info。
* @author 戴着假发的程序员
* @description
public interface Info {
修改Dog类,删除Dog类上方的注解,但是让Dog类实现接口Info。
* @author 戴着假发的程序员
* @description
public class Dog implements Info {
public Dog(){
System.out.println("实例化Dog类");
修改配置类,修改type属性为ASSIGNABLE_TYPE,value或者classes属性配置为Info .class。表示实现了Info接口的类要求spring加载。
* @author 戴着假发的程序员
* @description
@Configuration()
@ComponentScan(
basePackages = "com. st.dk.demo6.beans",
includeFilters = {@ComponentScan.Filter(type= FilterType.ASSIGNABLE_TYPE,value={Info.class})}
public class AppConfig {
再测试,我们会发现spring依然会加载Dog类。
[3]ASPECTJ:指定扫描AspectJ表达式相匹配的类,比如要求加载某个类的派生类
我们添加一个Animal类:
* @author 戴着假发的程序员
* @description
public class Animal {
修改Dog,继承Animal。
* @author 戴着假发的程序员
* @description
public class Dog extends Animal {
public Dog(){
System.out.println("实例化Dog类");
修改配置类,type配置为ASPECTJ,这里注意去掉value或者calsses属性,添加pattern属性,值为:com. st.dk.demo6.beans.Animal+
* @author 戴着假发的程序员
* @description
@Configuration()
@ComponentScan(
basePackages = "com. st.dk.demo6.beans",
includeFilters = {@ComponentScan.Filter(type= FilterType.ASPECTJ,pattern = "com. st.dk.demo6.beans.Animal+")}
public class AppConfig {
再测试,我们会发现spring依然会加载Dog类。
[4]REGEX:指定扫描符合正则表达式的类
我们可以通过REGEX配置一个正则表达式,spring会根据正则匹配加载对应的类。
案例:我们修改Dog类,不实现接口,不继承其他类,没有注解。
* @author 戴着假发的程序员
* @description
public class Dog{
public Dog(){
System.out.println("实例化Dog类");
修改配置类,type修改为REGEX,pattern修改为:“.*.*og”,表示加载og结尾的类。
* @author 戴着假发的程序员
* @description
@Configuration()
@ComponentScan(
basePackages = "com. st.dk.demo6.beans",
includeFilters = {@ComponentScan.Filter(type= FilterType.REGEX,pattern = ".*.*og")}
public class AppConfig {
再测试,我们会发现spring依然会加载Dog类。
[5]CUSTOM:指定扫描自定义的实现了org.springframework.core.type.filter.TypeFilter接口的类
CUSTOM允许我们自定义加载策略,我们可以自己实现一个TypeFilter,实现自己的加载策略。
案例:我们自己实现一个Filter,用来加载Dog类。添加一个自己的类实现接口TypeFilter
* @author 戴着假发的程序员
* @description
public class DkFilter implements TypeFilter {
@Override
public boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory) throws IOException {
String className = metadataReader.getClassMetadata().getClassName();
if(className.equals(Dog.class.getName())){
return true;
return false;
修改配置类,type修改为CUSTOM,value或者classes中配置DkFilter.class
* @author 戴着假发的程序员
* @description
@Configuration()
@ComponentScan(
basePackages = "com. st.dk.demo6.beans",
includeFilters = {@ComponentScan.Filter(type= FilterType.CUSTOM,value = DkFilter.cl
public class AppConfig {
再测试,我们会发现spring依然会加载Dog类。
2.32@ComponentScan注解的excludeFilters属性
我们已经知道ComponentScan的配置可以通知spring扫描拥有spring标准注解的类。这些标注大致是:@Component、@Controller、@Service、@Repository。我们也可通过excludeFilters属性配置排除我们不希望spring容器加载的类。
比如我们再web工程中只希望加载@Controller,就可以排除其他的标准注解的类。
这个属性和includeFilters 都是ComponentScan的属性,作用和includeFilters 正好相反,用于排除类。 但是配置方式和includeFilters 完全一样,同样有5个类型:
有两个必须的属性:
type: 配置filter的类型,这个类型一共有以下五个值:
assignable-指定扫描某个接口派生出来的类 annotation-指定扫描使用某个注解的类 aspectj-指定扫描AspectJ表达式相匹配的类 custom-指定扫描自定义的实现了org.springframework.core.type.filter.TypeFilter接口的类 regex-指定扫描符合正则表达式的类
expression: 根据type的不同,这个表达式的配置方式也不同。
具体的案例可以参考includeFilters 章节。
完结 后续继续更新springAOP相关细节。欢迎关注。。。。