目录
本章将讲 @ComponentScan (自动扫描) 注解。
@ComponentScan相当于XML的<context:component-scan>
一、自动扫描 @ComponentScan 注解
@ComponentScan注解和XML的<context:component-scan>功能是相同的,只不过是使用注解方式而已。
@ComponentScan有几种方式
1.1 标准方式
@ComponentScan(value = "扫描指定的包")
ps:如果和XML配置一起使用可以使用
如:
@ComponentScan(value = "com.hualinux.beans")
还可以带过滤功能,还有其它几个参数可选
excludeFilters = Filter[ ] : 指定扫描的时候按照什么规则排除那些组件
includeFilters = Filter[] : 指定扫描的时候只需要包含哪些组件|
如:
@ComponentScan(value = "com.hualinux",excludeFilters = {@ComponentScan.Filter(
type = FilterType.ANNOTATION,classes={Controller.class, Service.class})}, useDefaultFilters = false)
也可以使用复数
@ComponentScans(
value = {
@ComponentScan(value = "com.hualinux.beans",includeFilters = {
@ComponentScan.Filter(type = FilterType.ANNOTATION,classes = {
BookService.class
})
},useDefaultFilters = false)
}
)
1.2 自定义过滤规则
可以使用 @ComponentScan.Filter(type = FilterType.CUSTOM
如:
@ComponentScan(value = "com.hualinux",excludeFilters = {@ComponentScan.Filter(type = FilterType.CUSTOM,
classes={MyTyperFilter.class})}, useDefaultFilters = false)
注:上面class必须是TyperFilter的实现类,如上面自定义的 classes={MyTyperFilter.class}
查看TyperFilter类,看到参数的使用方式一
按着Ctrl键盘不放点上面 FilterType.CUSTOM的CUSTOM,鼠标会成变手形,点一下即会进入该类
metadataReader:读取到的当前正在扫描的类的信息
metadataReaderFactory :可以获取到其他任何类信息的
二、例子
2.1 例1:普通的自动扫描组件例
我就简单的在前一章建立的spring-annotation项目的基础上建立了,建立简单的MVC三层,分别用到了@Repository、@Service、@Controller这3个注解,什么都不用写
2.1.1 项目目录
2.1.2 实现代码
src-->com.hualinux.beans.dao.BooDao.java
package com.hualinux.beans.dao;
import org.springframework.stereotype.Repository;
@Repository
public class BooDao {
}
com.hualinux.beans.service.BookService.java
package com.hualinux.beans.service;
import org.springframework.stereotype.Service;
@Service
public class BookService {
}
com.hualinux.beans.controller.BookController.java
package com.hualinux.beans.controller;
import org.springframework.stereotype.Controller;
@Controller
public class BookController {
}
conf.MainConfAutoScan.java
package conf;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@ComponentScan(value = "com.hualinux.beans")
@Configuration
public class MainConfAutoScan {
}
PS:上面加了注解之外,没有写任何东西
com.hualinux.beans.AutoScanMain.java
package com.hualinux.beans;
import conf.MainConfAutoScan;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class AutoScanMain {
public static void main(String[] args) {
AnnotationConfigApplicationContext ctx=new AnnotationConfigApplicationContext(MainConfAutoScan.class);
String[] beanDefinitionNames = ctx.getBeanDefinitionNames();
for (String name: beanDefinitionNames){
System.out.println(name);
}
}
}
2.1.3 运行结果
运行上面AutoScanMain.java,发现找到了4个组件,连配置类都算进去了
mainConfAutoScan
bookController
booDao
bookService
2.2 例2:添加过滤条件
例1中默认是搜索所以组件的,在这里我能不能过滤不扫描,控制和服务组件呢,可以的,在配置文件修改一下
conf.MainConfAutoScan.java
package conf;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.FilterType;
import org.springframework.stereotype.Controller;
import org.springframework.stereotype.Service;
@ComponentScan(value = "com.hualinux",excludeFilters = {@ComponentScan.Filter(
type = FilterType.ANNOTATION,classes={Controller.class, Service.class})})
/*@ComponentScan(value = "com.hualinux.beans")*/
@Configuration
public class MainConfAutoScan {
}
再次运行一下,发现 Controller组件 和 Service组件 都不能使用了
2.3 例3:自定义过滤器
我在例1的基础上,定义一个过滤器,然后应用它
src-->com.hualinux.beans.MyTyperFilter.java
package com.hualinux.beans;
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;
public class MyTyperFilter implements TypeFilter {
@Override
public boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory) throws IOException {
AnnotationMetadata annotationMetadata=metadataReader.getAnnotationMetadata();
ClassMetadata classMetadata=metadataReader.getClassMetadata();
String className = classMetadata.getClassName();
System.out.println("--->"+className);
Resource resource = metadataReader.getResource();
return false;
}
}
修改一下conf.MainConfAutoScan.java
@ComponentScan(value = "com.hualinux",excludeFilters = {@ComponentScan.Filter(type = FilterType.CUSTOM,
classes={MyTyperFilter.class})}, useDefaultFilters = false)
@Configuration
public class MainConfAutoScan {
}
use-default-filters="false"
不使用默认的filters,默认filters为全部的注解包括了@Repository、@Service、@Controller、@Component等
运行之前的com.hualinux.beans.AutoScanMain,结果如下: