微服务下多模块拆分,公用类调用与模块隔离性怎么兼得呢

前言

在一个微服务项目中,为了追求低耦合,会根据业务板块对主系统进行切分为一个个子模块,模块间相互隔离,但是这样子就会导致一个问题:对于一些在多个子模块中都适用的配置类、工具类、封装类等都需要拷贝冗余到各个模块中,这样子显然是不太合理的,那么想要鱼和熊掌兼得,我们可以独立创建一个共用子模块,将这一类共用的数据类都给放到这里来,然后将该模块打包为jar包在各个子模块pom文件中引入,这样子就可以实现一份共用配置在多个子模块中使用,并保证了子模块间的隔离性。下面让我们来看一下相关的具体配置操作。

抽离共用资源成模块

我们在这一块可以将一些那些在多个子模块都需要的资源(eg:响应实体、常用工具类、常量类、全局异常处理等)抽离出来写到一个专门的公共资源模块中

业务模块引用

然后我们就可以将这个共用子模块进行打包为Jar给其他业务模块引用,这里科普一下 Maven 命令知识点,一般我们打包使用比较多的命令就是 package、install、deploy。

声明一点就是这三个命令都能打包,有什么区别呢?

  • package: 该命令完成了项目编译、单元测试、打包功能三个过程。
  • install: 在 package 命令的前提下新增一个步骤,将新打好的包部署到本地 Maven 仓库。
  • deploy: 在 install 命令的前提下新增一个步骤,将新打的包部署到远端仓库(相当于本地和远端仓库同时部署一份)。

而我们只是本地仓库引用,只需要 install 命令执行即可,两种方式分别是 Maven 插件或者终端执行命令 mvn clean install。

可以去对应的仓库坐标下查看 Jar 是否部署成功。如果不知道怎么操作可以参考我的另一篇文章【依赖dependency / 插件Plugin】 not found?可以看看这思路-CSDN博客

然后再其他业务模块的pom文件中就能直接进行引用啦

xml 复制代码
<dependencies>
    <dependency>
        <groupId>com.xxx</groupId>
        <artifactId>xxxx-common</artifactId>
        <version>1.0.0-SNAPSHOT</version>
    </dependency>
</dependencies>

注意点

这里要注意一下就是说,如果你公共模块中定义了SpringBean的话,想要进行自动装配就必须在公共模块的项目 Resources 目录下新建 META-INF 文件夹,然后创建 spring.factories 文件。在文件中填写好自动装配类的全限定类名

为什么要指定 resources/META-INF 下写 spring.factories?不这么写不行啊。

SpringFactoriesLoader#loadFactories 负责完成自动装配类的加载,扫描的就是这个变量文件。

你不按照规定写可以,扫不到你的自动配置类可咋整,消停的吧。

总结

总结起来,需要按照一定的规范将共用的配置类、工具类、封装类等放在共用子模块中,并将该子模块打包为jar包引入到各个子模块中。如果希望在共用子模块中的代码能够进行自动装配,需要在公共模块的 Resources 目录下创建 META-INF/spring.factories 文件,并在其中填写自动装配类的全限定类名。遵循这些配置操作可以实现共享配置并保持子模块间的隔离性。

相关推荐
yyovoll3 分钟前
Java包和权限的知识点介绍
java·spring
林shir9 分钟前
Java基础1.7-数组
java·算法
好奇的菜鸟15 分钟前
Docker 一键启动:打造高效的 Java 微服务开发环境
java·docker·微服务
二十雨辰16 分钟前
[SSM]SpringMVC请求与响应
java·spring·http
wangbing112518 分钟前
平台介绍-动态更换登录背景图
java
tryxr20 分钟前
继承存在的意义、特点、使用方法
java·开发语言·接口
tbRNA42 分钟前
Java 基础入门易错知识点(三)
java·开发语言
韩立学长1 小时前
【开题答辩实录分享】以《基于SSM的电影售票管理系统的设计与实现》为例进行选题答辩实录分享
java·spring·servlet
问道飞鱼1 小时前
【Rust编程语言】Rust数据类型全面解析
开发语言·后端·rust·数据类型
泉城老铁1 小时前
目前开源架构需要注意的安全问题
spring boot·后端