共计 1682 个字符,预计需要花费 5 分钟才能阅读完成。
ComponentScan
ComponentScan 主要的作用,就是告诉容器,去哪里扫描 bean,把符合情况的 bean 交给容器管理。如果有多个路径,可以用 @ComponentScans
注解。
在 spring 学习之 bean 的定义中,提到了这个注解。其他用法如下:
- XML 配置,
<context:component-scan base-package=""/>
- 上下文中扫描,再刷新。
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
ctx.scan("com.***.***");
ctx.refresh();
扫描规则
扫描的过滤规则包括 annotation 注解、assignable 特定类型、aspectj、regex 正则表达式、custom 自定义方式。
includeFilters:按照某种规则扫描组件。
excludeFilters:按照某种规则排除组件。
useDefaultFilters:true, 扫描所有组件,false,自定义。
excludeFilters
MyConfig2
@Configuration
@ComponentScan(value="com.learn.annotation",excludeFilters = {@ComponentScan.Filter(type =FilterType.ANNOTATION,classes = {Component.class})})
public class MyConfig2 {}
测试代码:
@Test
public void test2() {ApplicationContext app = new AnnotationConfigApplicationContext(MyConfig2.class);
String[] names = app.getBeanDefinitionNames();
for (String name : names) {System.out.println(name);
}
}
运行结果:
可以看出,注解是 Component 的已经被排除了。其他几种规则类似就不提了,下面看看自定义方式。
custom 自定义方式
MyFilter,必须实现 org.springframework.core.type .TypeFilter 接口。这边规则是包含 Controller 类名的类。
public class MyFilter implements TypeFilter {
@Override
public boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory) throws IOException {ClassMetadata classMetadata = metadataReader.getClassMetadata();
return classMetadata.getClassName().contains("Controller");
}
}
MyConfig3
@Configuration
@ComponentScan(value="com.learn.annotation",includeFilters = {@ComponentScan.Filter(type =FilterType.CUSTOM,classes = {MyFilter.class})},useDefaultFilters = false)
public class MyConfig3 {}
测试代码
@Test
public void test3() {ApplicationContext app = new AnnotationConfigApplicationContext(MyConfig3.class);
String[] names = app.getBeanDefinitionNames();
for (String name : names) {System.out.println(name);
}
}
运行结果:
正文完