Spring注解--@ComponentScan使用

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/fangxinde/article/details/82748395

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)

猜你喜欢

转载自blog.csdn.net/fangxinde/article/details/82748395