文章目录

  • 前言
  • 常见方法
  • 代码示例
    • 1、排除指定注解的类-annotation
    • 2、排查指定切面的类-aspectj
    • 3、排除继承至某接口或类的类-assignable
    • 4、排除符合指定匹配规则的类-regex
    • 5、叠加进行排除
    • 6、排除符合自定义规则的类-custom
    • 7、通过BeanDefinitionRegistryPostProcessor进行排除
  • 总结

前言

在做项目或写单元测试时,需要对某个特定的bean进行排除,为了方便大家的使用,这里对几种常见的方案进行总结。

常见方法

  1. 排除指定注解的类-annotation
  2. 排查指定切面的类-aspectj
  3. 排除继承至某接口或类的类-assignable
  4. 排除符合指定匹配规则的类-regex
  5. 叠加进行排除
  6. 排除符合自定义规则的类-custom
  7. 通过BeanDefinitionRegistryPostProcessor进行排除

注源码解释:"annotation" indicates an annotation to be present or meta-present at the type level in target components;"assignable" indicates a class (or interface) that the target components are assignable to (extend/implement);"aspectj" indicates an AspectJ type pattern expression to be matched by the target components;"regex" indicates a regex pattern to be matched by the target components' class names;"custom" indicates a custom implementation of the org.springframework.core.type.TypeFilter interface.

代码示例

1、排除指定注解的类-annotation

通过xml配置,可以将配置了@Service注解的类都排除掉

    <context:component-scan base-package="com.coderp"><context:exclude-filter type="annotation" expression="org.springframework.stereotype.Service"/></context:component-scan>
2、排查指定切面的类-aspectj

采用aspectj过滤,“com.coderp.service.impl…*”:表示下面的包及其子包(包切入点)

    <context:component-scan base-package="com.coderp" ><context:exclude-filter  type="aspectj" expression="com.coderp.service.impl..*"/></context:component-scan>

采用aspectj过滤,"*…Log":com.coderp所有的包及其子包下,只要有Log类,就会被排除

        <context:component-scan base-package="com.coderp" ><context:exclude-filter  type="aspectj" expression="*..Log"/></context:component-scan>
3、排除继承至某接口或类的类-assignable

通过xml配置,将Log类或继承Log的类都排除掉

    <context:component-scan base-package="com.coderp"><context:exclude-filter type="assignable" expression="com.coderp.service.impl.Log"/></context:component-scan>
4、排除符合指定匹配规则的类-regex

通过xml配置,将符合正则表达式模式的类进行排除

    <context:component-scan base-package="com.coderp"><context:exclude-filter type="regex" expression="com.coderp.service.impl.PayServiceImpl"/></context:component-scan>
5、叠加进行排除

通过xml配置,可以对多种过滤方式进行组合,如下组合assignable和aspectj方式

    <context:component-scan base-package="com.coderp"><context:exclude-filter type="assignable" expression="com.coderp.service.impl.Log"/><context:exclude-filter type="aspectj" expression="com.coderp.aspect..*"/></context:component-scan>
6、排除符合自定义规则的类-custom

自定义过滤规则MyTypeFilter,当返回true则将符合规则的类进行排除,如下的过滤规则会将类名称中包含“PayServiceImpl”的都会被排除。

public class MyTypeFilter implements TypeFilter {/*** 当我们实现TypeFilter接口时,需要实现TypeFilter接口中的match()方法,* match()方法的返回值为boolean类型。当返回true时,表示符合规则,* 会排除在Spring容器中;当返回false时,表示不符合规则,会包含在Spring容器中。* @param metadataReader :读取当前正在扫描的类的信息* @param metadataReaderFactory :可以获取到其它任务类的信息* @return* @throws IOException*/@Overridepublic boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory) throws IOException {//获取当前类注解的信息AnnotationMetadata annotationMetadata = metadataReader.getAnnotationMetadata();//获取当前正在扫描的类的信息ClassMetadata classMetadata = metadataReader.getClassMetadata();// 获取当前类的资源信息。例如类的路径等信息try {Resource resource = metadataReader.getResource();} catch (Exception e) {e.printStackTrace();}String className = classMetadata.getClassName();System.out.println("当前正在扫描的类----->"+className);System.out.println(className.contains("PayServiceImpl"));return className.contains("PayServiceImpl");}
}
    <context:component-scan base-package="com.coderp" ><context:exclude-filter type="custom" expression="com.coderp.filter.MyTypeFilter"/></context:component-scan>
7、通过BeanDefinitionRegistryPostProcessor进行排除

以上方式都是通过xml配置进行过滤的,当然也可以通过注解进行过滤,那能不能用直接用代码进行过滤呢?显然是可以的,这里利用BeanDefinitionRegistryPostProcessor类进行处理。如下示例,将“payServiceImpl”排除

@Service
public class RemoveRegistyBeanFactoryPostProcessor implements BeanDefinitionRegistryPostProcessor {@Overridepublic void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry beanDefinitionRegistry) throws BeansException {if (beanDefinitionRegistry.containsBeanDefinition("payServiceImpl")){beanDefinitionRegistry.removeBeanDefinition("payServiceImpl");}}@Overridepublic void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException {}
}

总结

通过上面的方法介绍和代码示例,希望能够帮助到大家,关键还是大家多练习,在工作中及时总结。

spring如何排除bean的注入相关推荐

  1. Spring常见错误 - Bean构造注入报空指针异常

    Spring常见错误 - Bean构造注入报空指针异常 前言 一. 构造器内报NPE 1.1 案例 1.2 原理分析 1.2.1 空指针发生在哪一个阶段? 1.2.2 studentService字段 ...

  2. 零配置 之 Spring 注解实现Bean依赖注入

    转载自  [第十二章]零配置 之 12.2 注解实现Bean依赖注入 --跟我学spring3 12.2  注解实现Bean依赖注入 12.2.1  概述 注解实现Bean配置主要用来进行如依赖注入. ...

  3. Spring 注解实现Bean依赖注入之@Qualifier

    三.@Qualifier:限定描述符,用于细粒度选择候选者: @Autowired默认是根据类型进行注入的,因此如果有多个类型一样的Bean候选者,则需要限定其中一个候选者,否则将抛出异常 @Qual ...

  4. Spring受管Bean依赖注入(设值注入)

    设值注入是Spring支持的多种依赖注入类型中的一种,也是最为常见的一种.设值(setter)注入指在通过调用无参构造器(或无参静态工厂方法,或工厂Bean的蜚静态工厂方法)实例化受管Bean后调用s ...

  5. spring基础——普通bean xml注入

    一.基本类型注入 1.set注入,前提是类中声明了属性的set方法 使用\ 2.有参构造器注入,前提是类中声明了有参构造器 使用<constructor-arg name="参数名&q ...

  6. 配置springmvc在其他类中(spring容器外)获取注入bean

    今天在写JedisUtils的时候要注入JedisPool,而这个属性被设置为static,@Resource和@Autowired都不可以注入,因为spring不能为静态变量依赖注入.因此需要额外的 ...

  7. 单元测试 applicationinfomanager bean无法注入_你真的会用Spring吗?如何在单例Bean中注入原型Bean...

    遇到什么问题 假设单例 BeanA 需要使用原型 BeanB(BeanB 可能是 BeanA 的一个属性值).可是容器仅创建一次单例 BeanA,因此只有一次机会来设置属性 BeanB. @Scope ...

  8. Spring之使用注解实例化Bean并注入属性

    1.准备工作 (1)导入jar包 除了上篇文章使用到的基本jar包外,还得加入aop的jar包,所有jar包如下 所需jar包 (2)配置xml <?xml version="1.0& ...

  9. Spring——Filter过滤器注入Bean时注入失败[NULL]

    问题描述 Spring中Filter注入Bean时注入失败,Bean一直为空. @Slf4j @Component public class RestAuthFilter extends FormAu ...

最新文章

  1. 更换pip安装源头成阿里云或清华的
  2. FFMPEG Tips (5) 如何利用 AVDictionary 配置参数
  3. 一款基于jquery和css3的头像恶搞特效
  4. ic卡复制软件_使用MCT复制IC卡0扇区的方法(适用于NFC手机复制或模拟门禁卡)...
  5. 【2022年蓝桥杯】蓝桥杯第一次海选考试题(5题考试大二)
  6. mongo java 日期,Java 8日期/时间(JSR-310)类型与Spring Data MongoDB的映射
  7. 成为最大的独立开源公司,对SUSE意味着什么? | 人物志
  8. MySql | 为什么大家都在说 Select * 效率低
  9. alwayson高可用组_AlwaysOn可用性组–如何在集群实例和独立实例之间设置AG(第2部分)
  10. Python While 循环语句
  11. python字典的作用_python字典方法介绍
  12. java 文件转换成二进制_java实现文件转换成二进制存储与取出
  13. ABP (ASP.NET Core 5.x + Vue)小白基础入门(一)
  14. Echarts绘制极坐标系下的多色柱状图
  15. sre工程师_什么是SRE? 现场可靠性工程师的重要作用
  16. 熵值法的python实现方法
  17. percentile_approx函数
  18. 腾讯企业邮信任此计算机,腾讯企业邮箱:微信动态密码为邮箱账号增加安全保障...
  19. office2016安装后右键新建没有word、excel、ppt等解决方法
  20. tp5中渲染页面将时间戳转换为日期时间格式(Y-m-d H:i:s)

热门文章

  1. windows到linux远程拷贝 pscp 不用输入密码,使用pscp实现Windows 和 Linux服务器间远程拷贝文件...
  2. 【高强度U盘文件夹加密工具】
  3. 企企通携手「帝迈生物」打造的数字化采购平台成功上线,客户发来暖心感谢信
  4. Node获取服务器信息
  5. 论文翻译 || openpose -- Realtime Multi-Person 2D Pose Estimation using Part Affinity Fields
  6. Android中的底部导航栏切换TabContainerView
  7. VisualGDB编译关键参数设置
  8. 虚拟机使用的是此版本 VMware Workstation 不支持的硬件版本。 模块“Upgrade”启动失败。 未能启动虚拟机。
  9. 【运维篇】运维知识点
  10. Java中的向上取整 Math.ceil(double)