美文网首页我爱编程
@ComponentScan 注解

@ComponentScan 注解

作者: 宿命99 | 来源:发表于2018-04-01 16:24 被阅读1342次

    在平时的开发,我们会配置 @Controller 、 @Service 、 @Repository 、@Component 注解来声明该类为 Spring IoC容器的组件。 在 xml 中会配置扫描包,那么使用 JavaConfig 的方式,同样可以配置扫描包。

    DAO 的注解类

    @Repository
    public class BusinessDAO {
        public void update() {
            System.out.println("调用了 dao 层的 update 方法....");
        }
    }
    

    Service 的注解类

    @Service
    public class BusinessService {
    
        @Autowired
        private BusinessDAO dao;
        
        public void service() {
            System.out.println("调用了 service 层的 service() 方法 .....");
            dao.update();
        }
    }
    

    Controller 的注解类

    @Controller
    public class BusinessController {
        
        @Autowired
        private BusinessService service;
        
        public void request() {
            System.out.println(" 调用了 Controller 的 request() 方法...");
            service.service();
        }
        
    }
    

    以上三个类是我们平时开发时经常使用的方式,在不同的类上打不同的注解,然后让 Spring 的包扫描自动去扫描这些类。

    Java Config 配置类

    @Configuration
    @ComponentScan("me.sjl.*")
    public class ScanConfig {
    }
    

    结果


    Bean 成功的加入到了 Spring IoC容器

    @ComponentScan 的排除规则

    FilterType.ANNOTATION 按注解类型排除

    @Configuration
    @ComponentScan(basePackages = "me.sjl.*", excludeFilters = {
            @Filter(type = FilterType.ANNOTATION, classes = Controller.class)
    })
    public class ScanConfig {
    }
    

    excludeFilters 属性表示排除规则, 可以写多个 @Filter 来排除, 上面的代码表示 排除 Controller 注解的类

    测试结果


    IoC 容器中已经不包含 Controller 注解的类了

    除了排除,还可以指定只包含的类注解
    JavaConfig 配置

    @Configuration
    @ComponentScan(basePackages = "me.sjl.*", useDefaultFilters = false, includeFilters = {
            @Filter(type = FilterType.ANNOTATION, classes = Controller.class)
    })
    public class ScanConfig {
    }
    

    useDefaultFilters = false 表示禁用默认的过滤规则

    FilterType.ASSIGNABLE_TYPE 类型

    FilterType.ASPECTJ AspectJ表达式

    FilterType.REGEX 正则表示达

    FilterType.CUSTOM 自定义规则

    自定义过滤规则是需要实现 TypeFilter 接口

    自定义扫描规则, 类名中带有 Service 的类,被 Spring IoC 容器扫描

    public class MyCustomerFilter implements TypeFilter {
    
        public boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory) throws IOException {
            String className = metadataReader.getClassMetadata().getClassName();
            return className.contains("Service");
        }
    }
    

    相关文章

      网友评论

        本文标题:@ComponentScan 注解

        本文链接:https://www.haomeiwen.com/subject/wdvicftx.html