前言
在一个微服务项目中,为了追求低耦合,会根据业务板块对主系统进行切分为一个个子模块,模块间相互隔离,但是这样子就会导致一个问题:对于一些在多个子模块中都适用的配置类、工具类、封装类等都需要拷贝冗余到各个模块中,这样子显然是不太合理的,那么想要鱼和熊掌兼得,我们可以独立创建一个共用子模块,将这一类共用的数据类都给放到这里来,然后将该模块打包为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文件中就能直接进行引用啦
<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
文件,并在其中填写自动装配类的全限定类名。遵循这些配置操作可以实现共享配置并保持子模块间的隔离性。