【Spring注解系列02】@CompentScan与@CompentScans

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

1.@CompentScan与@CompentScans

@CompentScan

为扫描包注解,只能作用于类上,一个类上可以有多个@CompentScan注解。

等价于 <context:component-scan base-package="com.java" ></context:component-scan>

使用了@ComponentScan注解后,指定包下的@Controller,@Service,@Repository,@Compent才会生效。

@component注解属性说明:

//excludeFilters = Filter[] :指定扫描的时候按照什么规则排除那些组件
//includeFilters = Filter[] :指定扫描的时候只需要包含哪些组件
//FilterType.ANNOTATION:按照注解
//FilterType.ASSIGNABLE_TYPE:按照给定的类型;
//FilterType.ASPECTJ:使用ASPECTJ表达式
//FilterType.REGEX:使用正则指定
//FilterType.CUSTOM:使用自定义规则

特别注意:过滤器必须实现TypeFilter接口,同时要使过滤器生效,必须将useDefaultFilters设置为false,该属性默认为true。

<context:component-scan base-package="com.java" use-default-filters="false"></context:component-scan>

 @ComponentScan(basePackages = {"com.java"},useDefaultFilters = false,
                includeFilters = {  @ComponentScan.Filter(type = FilterType.ANNOTATION,classes ={Controller.class}) })

@CompentScans

存在多个@ComponentScan时,可以使用@ComponentScans将这些@ComponentScan放在里面统一管理,@ComponentScans是一个数组。

@Configuration
@ComponentScan(basePackages = {"com.java.dao"})
@ComponentScan(basePackages = {"com.java.service"})
public class BeanConfig {

    @Bean("personAlias")
    public Person person2(){
        return new Person("2222","lisi");
    }
}


//等价


@Configuration
@ComponentScans({  
       @ComponentScan(basePackages = {"com.java.dao"}),
       @ComponentScan(basePackages = {"com.java.service"})
})
public class BeanConfig {

    @Bean("personAlias")
    public Person person2(){
        return new Person("2222","lisi");
    }
}

2.实例

条件:在包中已经建立有controller/service/dao的各层类,并且标有对应注解。

@Configuration
@ComponentScans({
        @ComponentScan(basePackages = {"com.java"},useDefaultFilters = false,
                includeFilters = {
                        //只有Controller注解才能注进来
                        @ComponentScan.Filter(type = FilterType.ANNOTATION,classes ={Controller.class}),
                        //只有符合自定义规则的类才能注进来
                        @ComponentScan.Filter(type = FilterType.CUSTOM,classes ={MyTypeFilter.class})
                    }
                )
})
public class BeanConfig {

    @Bean("personAlias")
    public Person person2(){
        return new Person("2222","lisi");
    }
}

过滤器:过滤器必须实现TypeFilter接口

public class MyTypeFilter implements TypeFilter {

    /**
     * metadataReader:读取到的当前正在扫描的类的信息
     * metadataReaderFactory:可以获取到其他任何类信息的
     */
    @Override
    public boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory) throws IOException {
        //获取当前类注解的信息
        AnnotationMetadata annotationMetadata = metadataReader.getAnnotationMetadata();
        System.out.println(annotationMetadata);
        if(annotationMetadata.getClassName().contains("vice")){
            return true;
        }
        
        //获取当前正在扫描的类的类信息
        ClassMetadata classMetadata = metadataReader.getClassMetadata();
        //获取当前类资源(类的路径)
        Resource resource = metadataReader.getResource();
        //获取任何类,可以是接口,可以是子类
        MetadataReader service = metadataReaderFactory.getMetadataReader("com.java.dao.PersonDao");

        return false;
    }
}

测试类

public class BeanDependencyInjectionTest {

    public static void main(String[] args) {
        System.out.println("-----------------------------annotation 注解方式注入-----------------------------------");
        //annotation 注解方式注入
        ApplicationContext applicationContext1 = new AnnotationConfigApplicationContext(BeanConfig.class);
        Person person1 = applicationContext1.getBean(Person.class);
        System.out.println("person1---->"+person1);
        //获取所有注入Bean的名称
        String[] beanDefinitionNames1 = applicationContext1.getBeanDefinitionNames();
        for (String name : beanDefinitionNames1) {
            System.out.println(name);
        }
    }
}

测试结果:我们可以看到只有controller和Service才能注入,dao是注入不进来的。

-----------------------------annotation 注解方式注入-----------------------------------
org.springframework.core.type.classreading.AnnotationMetadataReadingVisitor@382db087
org.springframework.core.type.classreading.AnnotationMetadataReadingVisitor@15bfd87
org.springframework.core.type.classreading.AnnotationMetadataReadingVisitor@543e710e
org.springframework.core.type.classreading.AnnotationMetadataReadingVisitor@57f23557
org.springframework.core.type.classreading.AnnotationMetadataReadingVisitor@3d0f8e03
org.springframework.core.type.classreading.AnnotationMetadataReadingVisitor@6366ebe0
person1---->Person{id='2222', name='lisi'}
org.springframework.context.annotation.internalConfigurationAnnotationProcessor
org.springframework.context.annotation.internalAutowiredAnnotationProcessor
org.springframework.context.annotation.internalCommonAnnotationProcessor
org.springframework.context.event.internalEventListenerProcessor
org.springframework.context.event.internalEventListenerFactory
beanConfig
personController
personService
personAlias

猜你喜欢

转载自blog.csdn.net/baidu_37107022/article/details/88877488
今日推荐