前言

  • springboot 2.0.0.RELEASE
  • maven 3.5.0
  • 这里介绍内容为,在spring boot启动时,排除/不加载某些Bean。spring boot启动时,排除/不加载某些模块/AutoConfiguration类,看这里。

排除/不加载某些Bean

排除/不加载某些Bean时,需要使用@ComponentScan。具体做法,可以采用下面的方式:

  • 方式1:自定义 @ComponentScan
  • 方式2:自定义 @ComponentScans
  • 方式3:自定义 TypeExcludeFilter

方式1:自定义 @ComponentScan

假设:我在使用 RuoYi 的时候,想自己的实现 ShiroConfig,而不用 RuoYi 自带的 ShiroConfig ,且,不删除 RuoYi 自带的 ShiroConfig 类。

此种情况下,就需要启动项目时,不加载 ShiroConfig 类。

针对此种情况,可以这样做:

@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class })
@ComponentScan(excludeFilters = {@Filter(type = FilterType.REGEX, pattern = {"com.ruoyi.framework.config.ShiroConfig"})})
public class RuoYiApplication {...
}

说明:

  • 使用自定义的 @ComponentScan 注解替换 @SpringBootApplication 的注解。
  • 定义 excludeFilters 属性。该属性指定排除的Bean/类。
  • 使用正则表达式方式( FilterType.REGEX )排除类 "com.ruoyi.framework.config.ShiroConfig"

方式2:自定义 @ComponentScans

@SpringBootApplication 有些特殊,官方的解释是:same as @Configuration @EnableAutoConfiguration @ComponentScan

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {...
}

你看!@SpringBootApplication 带了一个 @ComponentScan。一个 @ComponentScan 会影响 @ComponentScans(为啥?暂不清楚)。

所以,自定义 @ComponentScans 是应该这样:

@Configuration
@EnableAutoConfiguration(exclude = { DataSourceAutoConfiguration.class })
@ComponentScans({@ComponentScan(basePackages = {"com.ruoyi"}, excludeFilters = {@Filter(type = FilterType.REGEX, pattern = {"com.ruoyi.framework.config.ShiroConfig"})}),@ComponentScan(basePackages = {"com.third.package"}),
})
public class RuoYiApplication {...
}

说明:

  • 使用@Configuration @EnableAutoConfiguration @ComponentScans 替换了 @SpringBootApplication
  • 使用 @ComponentScans 是为了添加多个 @ComponentScan。只有一个 @ComponentScan 时,可以不用 @ComponentScans

方式3:自定义 TypeExcludeFilter

@SpringBootApplication 有些特殊,它带了一个 @ComponentScan

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {...
}

你看!@SpringBootApplication 自带的 @ComponentScan 中已经有了自定义的 excludeFilters。可以利用此特性实现排除/不加载某些Bean。

  1. 实现自己的 TypeExcludeFilter
public class MyTypeExcludeFilter extends TypeExcludeFilter {@Overridepublic boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory)throws IOException {if("com.ruoyi.framework.config.ShiroConfig".equals(metadataReader.getClassMetadata().getClassName())){System.out.println("skip >>>>>>> " + metadataReader.getClassMetadata().getClassName());return true;}return false;}}
  1. MyTypeExcludeFilterApplicationContext Initializer 时注册Bean(通过注解注册的Bean,进入 Spring 容器太晚了,不起作用)。
public class MyTypeExcludeFilterApplicationContextInitializer implements ApplicationContextInitializer<ConfigurableApplicationContext> {@Overridepublic void initialize(ConfigurableApplicationContext applicationContext) {applicationContext.addBeanFactoryPostProcessor(new MyTypeExcludeFilterPostProcessor());}private static class MyTypeExcludeFilterPostProcessorimplements PriorityOrdered, BeanDefinitionRegistryPostProcessor {public static final String BEAN_NAME = "com.ruoyi." + "myTypeExcludeFilter";@Overridepublic int getOrder() {return Ordered.HIGHEST_PRECEDENCE;}@Overridepublic void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {}@Overridepublic void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {RootBeanDefinition definition = new RootBeanDefinition(MyTypeExcludeFilter.class);registry.registerBeanDefinition(BEAN_NAME, definition);} }   }
  1. 注册 MyTypeExcludeFilterApplicationContextInitializer
    src/main/resources 目录下创建文件META-INF/spring.factories(如果该文件已存在,则无须创建)。在文件META-INF/spring.factories中添加内容:
org.springframework.context.ApplicationContextInitializer=\
com.ruoyi.MyTypeExcludeFilterApplicationContextInitializer

说明:操作复杂,实测效果不理想,不推荐使用。

参考

https://www.cnblogs.com/yql1986/p/9418419.html
https://stackoverflow.com/questions/41287276/when-should-i-use-typeexcludefilters-in-spring
https://docs.spring.io/spring-boot/docs/2.0.0.RELEASE/reference/htmlsingle/#boot-features-testing-spring-boot-applications-excluding-config

【sprinb-boot】排除/不加载某些Bean相关推荐

  1. Spring Boot2.x-04Spring Boot基础-使用注解装配bean

    文章目录 概述 通过Java配置文件@Bean的方式定义Bean 通过注解扫描的方式(@Component/@ComponentScan)装配Bean 使用excludeFilters属性不让IoC加 ...

  2. (转)Spring Boot通过ImportBeanDefinitionRegistrar动态注入Bean

    转自: Spring Boot通过ImportBeanDefinitionRegistrar动态注入Bean - 掘金在阅读SpringBoot源码时,看到SpringBoot中大量使用ImportB ...

  3. springboot mapper无法注入_Spring Boot通过ImportBeanDefinitionRegistrar动态注入Bean

    在阅读Spring Boot源码时,看到Spring Boot中大量使用ImportBeanDefinitionRegistrar来实现Bean的动态注入.它是Spring中一个强大的扩展接口.本篇文 ...

  4. springboot 读取配置文件_使用 @ConfigurationProperties 在 Spring Boot 中加载配置

    本文地址: 使用 @ConfigurationProperties 在 Spring Boot 中加载配置 使用 Spring Boot 加载配置文件的配置非常便利,我们只需要使用一些注解配置一下就能 ...

  5. BERT不加载预训练模型的理由

    如果数据量多的话,可以试试不加载已经预训练好的模型. 南方的仔回复叫我老周就好了 (作者)2019-04-10 数据16万条,但是不加载预训练的话那不就是从头开始训练了吗?官方啊说要很久唉 一起读Be ...

  6. AndroidStudio开发jni不加载libs的so,只加载jniLibs的so

    AndroidStudio开发jni不加载libs的so,只加载jniLibs的so,找了很多的办法,只有把libs文件夹改成jniLibs文件夹app才正常,因为ndk自动生成libs文件夹,有没有 ...

  7. Swift - 表格图片加载优化(拖动表格时不加载,停止时只加载当前页图片)

    列表的单元格中包含有图片在开发中很常见.通常我们可以直接在tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIn ...

  8. [IE技巧] 如何让IE 启动的时候不加载任何插件

    IE 命令行参数 -extoff  可以关闭IE插件功能,使IE 不加载.运行任何插件. 命令行:  C:\Program Files\Internet Explorer\iexplore.exe - ...

  9. gzip压缩後的javascript在ie下不加载

    URL:http://blog.iyi.cn/start/2007/07/gzipjavascriptie.html 很早之前就发现一个奇怪的问题,ie第一次打开一个页面时,javascript正常加 ...

最新文章

  1. 网络推广——企业新站还得是专业网络推广公司来维护!
  2. 【学习笔记】Vue的动态循环插入v-for
  3. 全球六大顶级域名动态:7月上旬.COM新增18.4万个
  4. vsphere平台windows虚拟机克隆的小插曲(无法登陆系统)
  5. 秒后面的单位是什么_单位与国际单位制是如何由来的?
  6. 直播预告 | 视觉SLAM在AR应用上的关键性问题探讨
  7. 【原创】一款符合当前主流审美的Swing外观(Look and Feel)_测试版发布
  8. 上传文件到某文件夹时,提示...路径访问被拒绝
  9. 【数据结构和算法笔记】:数据结构概述
  10. 大数据可视化方法有哪些
  11. pgAgent couldn't get a connection to the database!
  12. oracle oem打不开,oracle10g的oem打不开解决办法
  13. Qt优秀开源项目之十四:SortFilterProxyModel
  14. 探究CRM未来趋势:纷享销客的连接型CRM到底是什么?
  15. Oracle 12c CDB和PDB的切换
  16. java做一个查询网页版_用java写一个网页输入url点击查询即可在下面显示网页源代码...
  17. coding码市提交代码
  18. 数据分析综述:一文带你详细了解自动驾驶技术
  19. 谈谈你对 Spring 的理解
  20. Web全栈开发基础(小白入门版本)

热门文章

  1. 怎样才能找出哪个 CPU 内核正在运行该进程?(一)
  2. 【转】集合类说明及区别
  3. C# Bitmap类型与Byte[]类型相互转化
  4. Windows性能查看器:系统的性能信息(I/O,IIS最大连接数,Sql) ,以及解决 asp.net IIS 一二百多用户并发...
  5. C#内存泄露与资源释放 经验总结
  6. USB设备的插入和弹出的监听以及软弹出可移动媒体(如Windows的移除USB设备) ....
  7. jPlayer插件的使用
  8. MVC Html.AntiForgeryToken() 防止CSRF攻击
  9. Asp.net MVC中防止HttpPost重复提交
  10. SQL Service自定义数据类型