看《spring源码解析》笔记
1、使用@ComponentScan,会到对应包中对添加特定注解(@Service,@Constroller,@Repository)的类进行扫描,添加到容器中。
@Configuration
@ComponentScan(value="com.atguigu")
public class MainConfig { }
2、如果想查看容器中扫描出哪些:
@Test public void test01(){ AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfig.class); String[] definitionNames = applicationContext.getBeanDefinitionNames(); for (String name : definitionNames) { System.out.println(name); } }
3、使用包扫描的时候,还可以使用过滤规则,查看@ComponentScan的内容,可以发现:
/*只包含哪些,扫描的时候按照什么规则只需要包含哪些组件*/
ComponentScan.Filter[] includeFilters() default {};
/*包含哪些,扫描的时候按照什么规则排除那些组件*/
ComponentScan.Filter[] excludeFilters() default {};
其中includeFilters和excludeFilters都是Filter类的数组:
@Retention(RetentionPolicy.RUNTIME) @Target({}) public @interface Filter { FilterType type() default FilterType.ANNOTATION; @AliasFor("classes") Class<?>[] value() default {}; @AliasFor("value") Class<?>[] classes() default {}; String[] pattern() default {}; }
说明其中可以根据type进行包含或者屏蔽,type的值有:ANNOTATION,ASSIGNABLE_TYPE,ASPECTJ,REGEX,CUSTOM;
classes是一个Class数组。
以下为使用排除或只包含时的例子:
@Configuration @ComponentScan(value="com.atguigu",includeFilters = { @Filter(type=FilterType.ANNOTATION,classes={Controller.class})}) public class MainConfig { }
解释:扫描"com.atguigu"包下的类,通过注解进行过滤,只包含:注解是Controller的类
具体实现效果,通过第二步进行查看。
4、在过滤规则中还可以使用:useDefaultFilters = false,可以屏蔽spring默认加载的Bean。
@Configuration @ComponentScan(value="com.atguigu",includeFilters = { @Filter(type=FilterType.ANNOTATION,classes={Controller.class})},useDefaultFilters = false) public class MainConfig { }
5、延伸知识:
(1)、通过查看ComponentScan,可以发现其是可以重复的,即可以多写几次:
@Repeatable(ComponentScans.class)
(2)、当有多写几次的需求的时候,可以使用@ComponentScans注解,里面value是一个数组。
@ComponentScans(
value = {@ComponentScan(value="com.atguigu",includeFilters = {
@Filter(type=FilterType.CUSTOM,classes={MyTypeFilter.class})
},useDefaultFilters = false) ,
@ComponentScan(value="com.atguigu",includeFilters = {
@Filter(type=FilterType.ANNOTATION,classes={Controller.class})
},useDefaultFilters = false)}
)