1.@ComponentScan(value="com.rsd")修饰类:表示扫描此包下被@Controller、@Service、@Repository、@Component四大注解修饰的类,满足条件的类实例化,纳入容器。
2.@ComponentScan注解中 excludeFilters属性的使用
此案例表示@ComponentScan修饰类时,表示在包com.rsd下,除被@Controller修饰的类外,被其他注解修饰的类都被实例化,纳入容器
@ComponentScan(value="com.rsd",excludeFilters={
@Filter(type=FilterType.ANNOTATION,classes={Controller.class})
})
public class MainConfig {
//Bean的id默认为方法名,也可有由value值指定
@Bean(value="person03")
public Person person01(){
return new Person("lisi",20);
}
}
3.@ComponentScan注解中includeFilters属性的使用:在所定义的包下,包含某类型的组件
@ComponentScan(value="com.rsd",includeFilters={
@Filter(type=FilterType.ANNOTATION,classes={Controller.class})},
useDefaultFilters=false)
4.多条件扫描的组合
此案例表示:只扫描@Controller、@Service两注解修饰的类,并实例化放入容器
@ComponentScans(
value={
@ComponentScan(value="com.rsd",includeFilters={
@Filter(type=FilterType.ANNOTATION,classes={Controller.class})},
useDefaultFilters=false),
@ComponentScan(value="com.rsd",includeFilters={
@Filter(type=FilterType.ANNOTATION,classes={Service.class})},
useDefaultFilters=false)
})
5.根据java类的类型扫描
本案例扫描CarDao.class类型的java类,并实例化,放入容器
@ComponentScan(value="com.rsd",includeFilters={
@Filter(type=FilterType.ASSIGNABLE_TYPE,classes={CarDao.class})},
useDefaultFilters=false)
6.自定义过滤扫描
自定义一个类,实现接口TypeFilter.实现类对方法match()进行重写,自定义的过滤条件。
本案例扫描条件为:所扫描的类的全类名含有【Car】字符串的类
public class FilterCustom implements TypeFilter {
/**
* metadataReader:读取到的当前正在扫描的类的信息
* metadataReaderFactory:可以获取到其他任何类信息的
*/
@Override
public boolean match(MetadataReader metadataReader,
MetadataReaderFactory metadataReaderFactory) throws IOException {
//获取当前正在扫描的类的信息
ClassMetadata classMetadata = metadataReader.getClassMetadata();
String name=classMetadata.getClassName();
//获取当前定义包下所有类的全类名
System.out.println("当前扫描的类信息:"+name );
if (name.contains("Car")) {
return true;
}
return false;
}
}
@ComponentScan注解的属性classes值为自定义过滤类FilterCustom.java
@ComponentScan(value="com.atguigu",includeFilters={
@Filter(type=FilterType.CUSTOM,classes={FilterCustom.class})},
useDefaultFilters=false)