在使用xml方式配置时,我们只需要在xml中配置如下代码:

  1. <context:component-scan base-package="包名"></context:component-scan>

那么在java代码中使用如下四个注解,并且这些注解所在的包名是上面配置的包及其子包,那么spring会帮我们把相应的bean加如到IOC容器中。

  • @Controller

  • @Service
  • @Repository
  • @Component

在注解的方式下如何实现呢?在我们的配置类的上面加上如下注解即可

  1. @ComponentScan(value={"包名1","包名2"})

此时该注解指定的几个包名及其子包中如果有类被上面四个注解修饰,那么就会自动被注入到IOC容器中。

注意:如果ComponentScan没有其它配置的化,默认扫描与其配置类相同的包。

1、实战


新建一个maven工程,添加如下依赖

  1. <dependency>
  2. <groupId>org.springframework</groupId>
  3. <artifactId>spring-context</artifactId>
  4. <version>5.0.5.RELEASE</version>
  5. </dependency>

1、BookController

  1. package com.yefengyu.annotation.controller;
  2.  
  3. import org.springframework.stereotype.Controller;
  4.  
  5. @Controller
  6. public class BookController
  7. {
  8. }

2、BookService

  1. package com.yefengyu.annotation.service;
  2.  
  3. import org.springframework.stereotype.Service;
  4.  
  5. @Service
  6. public class BookService
  7. {
  8. }

3、BookRepository

  1. package com.yefengyu.annotation.repository;
  2.  
  3. import org.springframework.stereotype.Repository;
  4.  
  5. @Repository
  6. public class BookRepository
  7. {
  8. }

4、主配置类

  1. package com.yefengyu.annotation.config;
  2.  
  3. import org.springframework.context.annotation.ComponentScan;
  4. import org.springframework.context.annotation.Configuration;
  5.  
  6. @Configuration
  7. @ComponentScan(value = "com.yefengyu.annotation")
  8. public class MainConfig
  9. {
  10. }

5、测试

  1. public static void main(String[] args)
  2. {
  3. ApplicationContext ctx= new AnnotationConfigApplicationContext(MainConfig.class);
  4. String[] names = ctx.getBeanDefinitionNames();
  5. for (String name : names)
  6. {
  7. System.out.println(name);
  8. }
  9. }

6、结果

  1. org.springframework.context.annotation.internalConfigurationAnnotationProcessor
  2. org.springframework.context.annotation.internalAutowiredAnnotationProcessor
  3. org.springframework.context.annotation.internalRequiredAnnotationProcessor
  4. org.springframework.context.annotation.internalCommonAnnotationProcessor
  5. org.springframework.context.event.internalEventListenerProcessor
  6. org.springframework.context.event.internalEventListenerFactory
  7. mainConfig
  8. bookController
  9. bookRepository
  10. bookService

结果打印出如上内容,说明上面三个注解的bean都被添加到容器中。

2、规则过滤


@ComponentScan除了value 属性之外,还有其他属性,其中比较常用的是如下两个:

  • excludeFilters :排除哪些规则

  • includeFilters :指定哪些规则

他们的作用就是指定过滤规则。

1、指定规则

对于上面的代码,只需要修改主配置类中ComponentScan注解中的内容即可:

  1. @ComponentScan(value = "com.yefengyu.annotation", includeFilters = {@ComponentScan.Filter(type = FilterType.ANNOTATION, classes = Service.class)},useDefaultFilters = false)

上面的注解的含义是在com.yefengyu.annotation及其子包下面,将注解为Service的bean加入到容器中。注意useDefaultFilters 默认为true,表示使用默认的过滤规则:不过滤;如果需要指定规则,那么就需要将useDefaultFilters 设置为false。注意includeFilters 和useDefaultFilters 同时使用即可。

  1. org.springframework.context.annotation.internalConfigurationAnnotationProcessor
  2. org.springframework.context.annotation.internalAutowiredAnnotationProcessor
  3. org.springframework.context.annotation.internalRequiredAnnotationProcessor
  4. org.springframework.context.annotation.internalCommonAnnotationProcessor
  5. org.springframework.context.event.internalEventListenerProcessor
  6. org.springframework.context.event.internalEventListenerFactory
  7. mainConfig
  8. bookService

2、排除规则

对于上面的代码,只需要修改主配置类中ComponentScan注解中的内容即可:

  1. @ComponentScan(value = "com.yefengyu.annotation", excludeFilters = {@ComponentScan.Filter(type = FilterType.ANNOTATION, classes = Service.class)})

如果要排除某些规则,就要使用excludeFilters ,注意不需要使用useDefaultFilters ,默认即可。

  1. org.springframework.context.annotation.internalConfigurationAnnotationProcessor
  2. org.springframework.context.annotation.internalAutowiredAnnotationProcessor
  3. org.springframework.context.annotation.internalRequiredAnnotationProcessor
  4. org.springframework.context.annotation.internalCommonAnnotationProcessor
  5. org.springframework.context.event.internalEventListenerProcessor
  6. org.springframework.context.event.internalEventListenerFactory
  7. mainConfig
  8. bookController
  9. bookRepository

上面注解的含义就是在com.yefengyu.annotation及其子包下面,将注解为Controller的bean排除容器之外。

3、FilterType的类型

  • ANNOTATION:注解,常用

  • ASSIGNABLE_TYPE:给定类型,该类型及其子类、接口的实现类都起作用
  • ASPECTJ
  • REGEX:正则
  • CUSTOM:自定义

自定义类型的使用方式:

  1. package com.yefengyu.annotation;
  2.  
  3. import org.springframework.core.io.Resource;
  4. import org.springframework.core.type.AnnotationMetadata;
  5. import org.springframework.core.type.ClassMetadata;
  6. import org.springframework.core.type.classreading.MetadataReader;
  7. import org.springframework.core.type.classreading.MetadataReaderFactory;
  8. import org.springframework.core.type.filter.TypeFilter;
  9.  
  10. import java.io.IOException;
  11.  
  12. public class MyTypeFilter implements TypeFilter
  13. {
  14. @Override
  15. public boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory)
  16. throws IOException
  17. {
  18. //获取当前类注解信息
  19. AnnotationMetadata annotationMetadata = metadataReader.getAnnotationMetadata();
  20. //获取当前扫描的类的信息
  21. ClassMetadata classMetadata = metadataReader.getClassMetadata();
  22. //获取当前扫描类资源信息
  23. Resource resource = metadataReader.getResource();
  24.  
  25. String className = classMetadata.getClassName();
  26. if (className.contains("er"))
  27. {
  28. return true;
  29. }
  30. return false;
  31. }
  32. }

实现TypeFilter接口,重写match方法,满足条件的则返回true.

然后指定扫描策略:

  1. @ComponentScan(value = "com.yefengyu.annotation", excludeFilters = {@ComponentScan.Filter(type = FilterType.CUSTOM, classes = MyTypeFilter.class)})

结果如下:

  1. org.springframework.context.annotation.internalConfigurationAnnotationProcessor
  2. org.springframework.context.annotation.internalAutowiredAnnotationProcessor
  3. org.springframework.context.annotation.internalRequiredAnnotationProcessor
  4. org.springframework.context.annotation.internalCommonAnnotationProcessor
  5. org.springframework.context.event.internalEventListenerProcessor
  6. org.springframework.context.event.internalEventListenerFactory
  7. mainConfig
  8. bookRepository

将类中含有er的排除在外。

4、指定多个ComponentScan

1、在jdk8以后可以直接写多个ComponentScan

  1. @ComponentScan(basePackages = "com.yefengyu.annotation1")
  2. @ComponentScan(basePackages = "com.yefengyu.annotation2")

2、也可以使用ComponentScans注解

  1. @ComponentScans(value = {
  2. @ComponentScan(basePackages = "com.yefengyu.annotation1"),
  3. @ComponentScan(basePackages = "com.yefengyu.annotation2")
  4. })

spring注解开发:ComponentScan组件扫描的更多相关文章

  1. Spring注解开发系列Ⅰ--- 组件注册(上)

    传统的Spring做法是使用.xml文件来对bean进行注入或者是配置aop.事物,这么做有两个缺点:1.如果所有的内容都配置在.xml文件中,那么.xml文件将会十分庞大:如果按需求分开.xml文件 ...

  2. 【Spring注解开发】组件注册-使用@Configuration和@Bean给容器中注册组件

    写在前面 在之前的Spring版本中,我们只能通过写XML配置文件来定义我们的Bean,XML配置不仅繁琐,而且很容易出错,稍有不慎就会导致编写的应用程序各种报错,排查半天,发现是XML文件配置不对! ...

  3. Spring注解开发系列Ⅱ --- 组件注册(下)

    1.@Import注册组件 @Import主要功能是通过导入的方式实现把实例加入springIOC容器中, /** * 给容器注册组件 * 1.包扫描+组件标注注解(@Controller,@Serv ...

  4. spring注解开发:容器中注册组件方式

    1.包扫描+组件标注注解 使用到的注解如下,主要针对自己写的类 @Controller @Service @Repository @Component @ComponentScan 参考 spring ...

  5. 浅尝Spring注解开发_自定义注册组件、属性赋值、自动装配

    Spring注解开发 浅尝Spring注解开发,基于Spring 4.3.12 包含自定义扫描组件.自定义导入组件.手动注册组件.自动注入方法和参数.使用Spring容器底层组件等 配置 @Confi ...

  6. 浅尝Spring注解开发_Bean生命周期及执行过程

    Spring注解开发 浅尝Spring注解开发,基于Spring 4.3.12 包含Bean生命周期.自定义初始化方法.Debug BeanPostProcessor执行过程及在Spring底层中的应 ...

  7. 浅尝Spring注解开发_Servlet3.0与SpringMVC

    浅尝Spring注解开发_Servlet 3.0 与 SpringMVC 浅尝Spring注解开发,基于Spring 4.3.12 Servlet3.0新增了注解支持.异步处理,可以省去web.xml ...

  8. Annotation(三)——Spring注解开发

    Spring框架的核心功能IoC(Inversion of Control),也就是通过Spring容器进行对象的管理,以及对象之间组合关系的映射.通常情况下我们会在xml配置文件中进行action, ...

  9. Spring IOC基础回顾 — 组件扫描和装配

    目录 注解形式配置应用IOC 1. 组件自动扫描 2. 组件依赖:为bean添加注解,实现自动注入 3. Spring IOC应用小结 注解形式配置应用IOC 在类定义.方法定义.成员变量定义前使用, ...

  10. Spring注解开发系列Ⅵ --- AOP&事务

    注解开发 --- AOP AOP称为面向切面编程,在程序开发中主要用来解决一些系统层面上的问题,比如日志,事务,权限等待,Struts2的拦截器设计就是基于AOP的思想,横向重复,纵向抽取.详细的AO ...

随机推荐

  1. 怎么区分PV、IV、UV以及网站统计名词解释(pv、曝光、点击)

    PV(Page View)访问量,即页面访问量,每打开一次页面PV计数+1,刷新页面也是. IV(Internet Protocol)访问量指独立IP访问数,计算是以一个独立的IP在一个计算时段内访问 ...

  2. JS小案例--全选和全不选列表功能的实现

    纯js代码实现列表全选和全不选的功能 <!DOCTYPE html> <html> <head lang="en"> <meta char ...

  3. elasticsearch 基础 —— Delete By Query API

    Delete By Query API _delete_by_query 的简单用法,就是在查询匹配到的每个文档上执行删除.例如: POST twitter/_delete_by_query { &q ...

  4. 靶场练习--sqli(1&2)

    前言 懒猪赵肥肥耍了3天3夜,每天除了练英语口语,啥子都没干.今天开始发愤图强,嘻嘻~ 计划内容有:靶场.视频.python.PHP.java.计算机英语. 首先,每天必搞靶场必看视频必学java和英 ...

  5. 挖坑指南:iView-admin动态配置route.meta.title

    原文链接 前言 新的项目,基于iView-admin.结合自身的项目需求,对官方的模板进行一些修改.以达到动态修改route.meta,并同步更新面包屑导航文字和标签页标题. 开始 如果你还未使用过i ...

  6. ORA-01555 快照过旧

    用户user1对表进行了更新操作,用户user2在user1还没有进行提交前读表中数据,而且是大批量的读取(打个比方:耗时3分钟)而在这3分钟内user1进行了提交操作,那又会产生什么影响呢?这个时候 ...

  7. HDU-4676 Sum Of Gcd 莫队+欧拉函数

    题意:给定一个11~nn的全排列AA,若干个询问,每次询问给出一个区间[l,r][l,r],要求得出∑l≤i<j≤r  gcd(Ai,Aj)的值. 解法:这题似乎做的人不是很多,蒟蒻当然不会做只 ...

  8. Swift--Unmanaged使用

    Unmanaged使用 作者 Nate Cook 翻译者 Croath Liu 2015年4月13日        API 对于开发者来说不只是把功能点接口暴露出来而已,同时也传达给我们一些其他的信息 ...

  9. Spring MVC 跳转失败,但配置正确填坑

    1:正确写法 @RequestMapping("{type_key}.html") public String geren(Model model, @PathVariable S ...

  10. Vue实现active点击切换样式

    1.html <div class="filter-nav" v-for="(item,index) in filterData.navTab" :key ...