SpringBoot扫包排除指定包(配置文件形式)

news2025/1/31 8:21:40

1、背景​

在有些时候,不同环境可能需要用代码不同模块的能力,但是不同环境的项目包是一致的。这块我们想到的最简单的办法是在maven打包的时候打不同的模块,但是这样往往需要出多个包,虽然这种方式是正路但运维同学嫌麻烦。第二种方式是在spring扫包时候排除指定的排除的类或者模块,针对模块来说则需要自己实现,作者经过测试发现这种方式存在很大的问题,网上大面积是这种解决方案,基本都是乱抄。第三种方式则是采用spring的后置处理器实现。下边作者把这几种方式的实现大概写下。

2、maven打包方式

mvn package a b c

这种方式通过传不同的abc进行出包,但不是我们想要的方式。

3、使用@ConponentScan注解

现在一般项目都用Springboot开发,直接用@SpringBootApplication即可,该注解提供了baseScan的路劲配置能力,但是在exclude掉不想要的模块时就显得力不从心。我们打开@SprinbootApplication注解时发现其为三个注解的整合,其参数basescan**本质就是@ConponentScan注解,但是@SpringBootApplication无法定制化exclude能力,所以我们将@SpringBootApplication里的三个注解提炼出来,替代@SpringbootApplication

然后改造如下:

@SpringBootConfiguration @EnableAutoConfiguration @ComponentScan(includeFilters = @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class))
public static void main(string[] args){
Springbootapplication.run(a.class);
}

注意这块作者是直接用手机写的,全凭记忆,把大概过程记录一下。

这块的FilterType类型有以下

FilterType.ANNOTATION:按照注解过滤
FilterType.ASSIGNABLE_TYPE:按照给定的类型,指定具体的类,子类也会被扫描到
FilterType.ASPECTJ:使用ASPECTJ表达式
FilterType.REGEX:正则
FilterType.CUSTOM:自定义规则
useDefaultFilters: 配置是否开启可以对加@Component,@Repository,@Service,@Controller注解的类进行检测, 针对Java8 语法可以指定多个@ComponentScan

我们要排除包则需要用CUSTOM类型去自定义实现。

这里作者直接用伪代码开写✍🏻

public class TypeExcludeFilter implement TypeFilter,EnvironmentAware{

  private string[] exclude;

public boolean match(元参数,源参数工厂){

      通过源参数拿到类class信息

      通过class拿到注解信息

      如果没有注解则直接返回true

      循环检测类路劲是否在配置项的路劲中如果检测到则返回false,标记扫包的时候不要注册此类

}

public void setEnvireonment(配置对象)

      获取要排除的包路劲

      将包路径转化为exclude

}

通过上边伪代码的描述,似乎这种方式能解决问题,但是要判断是否有注解才能继续,否则很多类都被误杀,对于项目很大的情况下,这种方式让人很头大,完全是人肉模式。所以这种方式只能是最差的方式。

3、通过Spring的beanRegisryPostProcesser进行移除。

这种方式在bean真正实例化之前进行操作,避免项目启动一些资源类直接初始化产生的问题,个人觉得这种方式是比较可靠并且维护成本也低。因为手机打字,这块作者直接伪代码截图了。

f08fbf0549408346fe7d9712ed99238e.png

《全文完》

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/433492.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java面试题--MySQL索引

一. 索引介绍 MySQL的索引是一种数据结构,它可以帮助MySQL快速定位需要访问的记录。索引可类比于一本书的目录,通过它可以快速找到某个特定的记录。 MySQL支持多种类型的索引,每种索引都有其优势和局限性,常用的包括&#xff1a…

python类型转换

我们就想那我们目前接触到的三种类型做一下转换 分别是 字符串 浮点数 正整数 可能会有刚接触编程的小伙伴在想 没事类型转换什么呢? 其实在实际开发中 这东西用的不要太多 根据我们目前认识的类型 先用到三个方法 我们编写代码 String_int str(111); print(St…

初阶数据结构——时间复杂度和空间复杂度

目录 算法效率算法的复杂度 时间复杂度时间复杂度的概念习题 空间复杂度空间复杂度的概念习题 什么是数据结构? 数据结构(Data Structure)是计算机存储、组织数据的方式,指相互之间存在一种或多种特定关系的数据元素的集合。 什么是算法? 算法…

java+ssm603企业人事档案管理系统带前端springboot

人事管理系统的设计与实现采用Spring、SpringMVC和MyBatis作为主体框架,系统设计遵循界面层、业务逻辑层和数据访问层的Web开发三层架构。采用B/S结构,使得系统更加容易维护。人事管理系统的设计与实现主要实现角色有管理员和用户,管理员在后台管理资料文件模块、员工模块、文件…

深度相机初体验:Hello World

当我的组长给了我一个深度相机,倒霉的事情就开始了,在使用的过程中遇到的某些问题搜不到,头秃啊呜呜呜呜呜呜呜呜 配置: ubuntu20.04(我实在是懒得去升级了,一旦升级就可能会出现找不到教程的可能性&#x…

运行时内存数据区之执行引擎(一)

执行引擎概述 执行引擎是Java虚拟机核心的组成部分之一。 “虚拟机”是一个相对于“物理机”的概念,这两种机器都有代码执行能力,其区别是物理机的执行引擎是直接建立在处理器、缓存、指令集和操作系统层面上的,而虚拟机的执行引擎则是由软…

【MATLAB基础绘图第8棒】绘制局部放大图

MATLAB绘制局部放大图 1 工具准备 MATLAB官网-ZoomPlot(Kepeng Qiu. Matlab Central, 2022) 初始数据图绘制完成后,调用以下代码: %% 添加局部放大 zp BaseZoom(); zp.plot;1.1 具体绘制步骤 具体绘制步骤如下: 通过鼠标左键框选作图区…

JavaScript中如何删除对象/数组中null、undefined、空对象及空数组实例代码

如下,对于一个多层嵌套的数据结构:例如 要做的就是删除所有value为空,数组为空,对象为空的字段 const querys {name: 测试,httpMethod: ,httpHeaders: [{key: Accept,value: test,},],restParams: [{key: ,value: ,},],body: {b…

GZIPOutputStream GZIPInputStream 数据压缩解压

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 数据压缩&解压 前言一、最终走上了压缩的路 GZIPOutputStream二、收到数据进行解压 GZIPInputStream三、测试Demo四、验证结果总结 前言 最近接手了一批性能优化… 遇到…

全注解下的SpringIoc

Spring架构中的核心理念就是IOC和AOP,可以说,Spring的强大离不开这两大特性。 因为spring boot推荐采用注解开发,所以文中主要介绍基于注解的Spring Ioc。 IoC容器简介 Spring IoC 容器是个管理 Bean(在Spring 中把每个需要管理…

VMware vCenter Server 8.0U1 发布 - 集中式管理 vSphere 环境

请访问原文链接:VMware vCenter Server 8.0U1 - 集中式管理 vSphere 环境,查看最新版。原创作品,转载请保留出处。 作者主页:sysin.org 2023-04-18, VMware vSphere 8.0U1 发布。 详见:VMware vSphere 8 Update 1 新…

单片机的实例——28BYJ48步进电机

整体过程 准备资料1,步进电机内部结构示意图2,步进电机命名3,实际结构的转速比4,数值的含义5,实际内部主动轮结构分析实际内部机构及接线定子部分转子部分 定子和转子磁极的工作分析 6,工作时序7&#xff0…

机器学习 day06(向量化应用于多元线性回归的梯度下降算法,正规方程)

向量化多元线性回归,及梯度下降算法 将W₁,…,Wn写成向量W,将X₁,…,Xn写成向量X,而b还是之前的b注意:在多元线性回归的梯度下降算法中,Wj是指从W₁到Wn中的某一项&…

堆排序及top-k问题

堆排序及top-k问题 堆排序建堆向上调整建堆向下建堆 堆排序 top-k问题,建堆的应用 堆排序 堆排序,听名字就是要对堆进行排序,但当我们是无序数据时,首先我们就需要建立一个堆 建堆 这里让我们来回忆一下前面的堆,改…

Springboot基础学习之(二十三):实现定时任务

定时任务:在开发过程中是经常能够使用到的:定时发布邮件等等 先了解一下什么时cron表达式? 它是定义执行任务时间的一种时间表达式,使用方法 Scheduled(cron "0/2 * * * * ? "),这里代码的含义是每两秒执行…

适用于 Windows 的 5 个最好的 PDF 转换器应用程序

由于稳定性、高分辨率、高安全性、易于传输等特点,PDF已经成为我们日常工作中最常用的格式。我们在享受PDF带来便利的同时,也发现PDF带来了一些不便,其中最大的问题就是PDF内容的编辑难度。同时,并不是所有的文件都是PDF格式的&am…

【redis】Redis为什么能抗住10万并发?

文章目录1. Redis简介2. 内存操作3. 丰富的对象类型4. 高效的数据结构5. 单线程模型6. 多路IO复用模型7. 总结1. Redis简介 Redis是一个开源的,基于内存的,高性能的键值型数据库。它支持多种数据结构,包含五种基本类型 String(字…

搭建vue3项目+按需引入element-ui框架组件

场景:使用vue create脚手架快速搭建vue的项目 前提:需要安装node.js和cnpm以及yarn 并且cnpm需要设置为淘宝镜像,cnpm和yarn安装教程网上很多可以自行搜索 1.使用dos命令安装vue-cli脚手架 //这个是从镜像源下载 cnpm install -g vue/cli 查…

设计模式简述

设计模式(简述) 设计模式的分类 ​ 根据目的可以分为创建型、结构性和行为型三类: 创建型模型:创建对象结构性模型:处理类或对象的组合行为型模式:用于描述对类或对象怎样交互和怎么分派职责 ​ 根据范围可以分为类模式和对象…

13.基于双层优化的电动汽车日前-实时两阶段市场竞标

MATLAB代码:基于双层优化的电动汽车日前-实时两阶段市场竞标 关键词:日前-实时市场竞标 电动汽车 双层优化 编程语言:MATLAB平台 内容简介:代码主要做的是电动汽车充电站市场竞标策略,采用双层优化模型对电动汽车…