IntelliJ+SpringBoot项目实战(十二)--设计项目多模块依赖关系和跨模块调用服务和接口

       在非微服务的项目中,一个应用里有多个子系统,例如在一个电商系中,有系统管理子系统、内容管理子系统和电商管理子系统,我们想实现这样的效果:

(1)只需要启动一个SpringBoot应用,不需要每个子系统都单独启动一个应用。

(2)只需要配置一个application.yml或application-dev.yml,不需要在每个子系统单独配置yml。

  (3)   启动一个SpringBoot应用,各个子系统的@RestController和@Controller接口都可以访问,

         而且是基于一个端口。

 (4)其他子系统都可以跨模块调用系统管理子系统的服务。例如电商子系统可以调用系统管理子

          系统里的用户Service和部门Service。

       这样我们需要对主工程、核心工程、starter工程、系统管理模块、其他各子系统模块的依赖关系进行梳理,并根据梳理的依赖关系修改工程里的模块依赖。

       在上图中,openjweb-common是基础工程,含通用的底层通用类库。openjweb-starter为各种启动工程。openjweb-core是核心工程(系统管理相关的如组织机构、权限、角色、用户管理、数据字典等,为各业务子系统都依赖的公共API和服务),openjweb-b2c、openjweb-cms代表各业务系统如电商、内容管理系统。openjweb-sys依赖各业务系统,这样启动时,启动在openjweb-sys的SpringBoot应用,application.yml或application-dev.yml项目配置参数只需要配置在openjweb-sys工程中,这样免得到各个模块中单独配置。

        按照上面的规划,总工程的pom.xml包含所有子模块:

       

        openjweb-common是底层类库,不依赖其他模块。不过注意不要在pom.xml里加build和springboot-starter。但需要根据情况增加web相关依赖(如果openjweb-common不开发Controller的话,则不需要加Web相关的依赖):

    <dependencies><dependency><groupId>org.apache.tomcat.embed</groupId><artifactId>tomcat-embed-core</artifactId></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-web</artifactId></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId></dependency></dependencies>

        openjweb-core中增加对openjweb-common的依赖,另外因为openjweb-core中会有@RestController、@Controller、@Service,所以需要添加Web相关的依赖,下面是openjweb-core的pom.xml的依赖:

  <dependency><groupId>org.apache.tomcat.embed</groupId><artifactId>tomcat-embed-core</artifactId></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-web</artifactId></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.openjweb</groupId><artifactId>openjweb-common</artifactId><version>0.0.1-SNAPSHOT</version><scope>compile</scope></dependency></dependencies>

        openjweb-sys是启动应用的包,所以依赖openjweb-core和所有的子系统,因为需要通过localhost:8001/ 访问到所有子系统里的接口:

<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.openjweb</groupId><artifactId>datasource-openjweb-starter</artifactId><version>0.0.1-SNAPSHOT</version></dependency><dependency><groupId>org.openjweb</groupId><artifactId>redis-openjweb-starter</artifactId><version>0.0.1-SNAPSHOT</version><scope>compile</scope></dependency><dependency><groupId>org.openjweb</groupId><artifactId>openjweb-core</artifactId><version>0.0.1-SNAPSHOT</version><scope>compile</scope></dependency><dependency><groupId>org.openjweb</groupId><artifactId>openjweb-sns</artifactId><version>0.0.1-SNAPSHOT</version><scope>compile</scope></dependency><dependency><groupId>org.openjweb</groupId><artifactId>openjweb-cms</artifactId><version>0.0.1-SNAPSHOT</version><scope>compile</scope></dependency><dependency><groupId>org.openjweb</groupId><artifactId>openjweb-b2c</artifactId><version>0.0.1-SNAPSHOT</version><scope>compile</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build>

注意依赖的子系统需要增加<scope>compile</scope>。

        现在我们做几个示例,首先是在openjweb-sys启动时,可以访问openjweb-core 里的查询公司信息接口:

       在openjweb-core的org.openjweb.core.api下面创建一个CommCompanyApi.java:

package org.openjweb.core.api;import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RequestMapping("/api/comm/company")
@RestController
public class CommCommpanyApi {//localhost:8001/api/comm/company/query@RequestMapping("query")public String getComName(){String comName = "百度";return comName;}
}

然后启动openjweb-sys,访问http://localhost:8001/api/comm/company/query ,页面显示:

        说明openjweb-sys可以访问其他模块的接口。

        接下来我们看下在openjweb-core中能否使用以前课程定义的数据库组件访问数据库,还在这个CommCompanyApi增加下面的代码:

 @Resource(name = "jdbcTemplateOne")private JdbcTemplate service;//localhost:8001/api/comm/company/queryDb@RequestMapping("queryDb")public String getComNameDb(){int count = service.queryForObject("select count(*) from comm_system_parms ",Integer.class);return String.valueOf(count);}

        前面章节示例中创建了comm_system_parms并插入了记录,启动openjweb-sys的SpringBoot应用,访问http://localhost:8001/api/comm/company/queryDb :

可以成功查询数据库。

        另外我们再测试下能否在其他子系统里访问openjweb-core里的Service。如果可以的话,我们就可以在其他系统里调用openjweb-core里的用户、部门、人员等基础Service。我们首先在openjweb-core工程的org.openjweb.core.service下面创建一个CommDeptService.java (部门Service):

package org.openjweb.core.service;import org.springframework.stereotype.Service;@Service
public class CommDeptService {public String getDeptDemoName(String comId){return "研发部";}}

        这里补充说明一下,之前建的 openjweb-b2c子模块有问题,就是不管怎样也没法调用openjweb-b2c的接口,所以删掉了openjweb-b2c模块,重新增加了openjweb-b2b2c模块,上面所有关于openjweb-b2c模块的命名都改为openjweb-b2c。

       然后我们看下openjweb-b2b2c模块的依赖:

    <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.openjweb</groupId><artifactId>openjweb-core</artifactId><version>0.0.1-SNAPSHOT</version><scope>compile</scope></dependency></dependencies>

注意上面的

        <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency>

        这段不要手工加,手工加的好像系统不认,而是下面写API时引用@RestController时这行标红,用Alt+Enter会导入库依赖并自动在pom.xml里添加,如果已经添加了会重复添加。下面我们看下增加的测试类B2cDeptApi.java :

package org.openjweb.b2c.api;import org.openjweb.core.service.CommDeptService;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;@RequestMapping("/api/b2b2c/dept")
@RestController
public class B2cDeptApi {//localhost:8001/api/b2b2c/dept/query@RequestMapping("query")public String getDeptName(){String name = "研发部1";return name;}@Resourceprivate CommDeptService commDeptService;//localhost:8001/api/b2b2c/dept/queryService@RequestMapping("queryService")public String getDeptName2(){String name = commDeptService.getDeptDemoName("");return name;}
}

   getDeptName演示了调用openjweb-b2b2c包里的api接口,启动openjweb-sys的springboot应用后,访问 http://localhost:8001/api/b2b2c/dept/query :

第二个方法deptDeptName2演示了调用openjweb-core里的CommDeptService服务组件,通过

@Resource 引用了这个组件,这说明可以调用不同模块的业务组件。访问http://localhost:8001/api/b2b2c/dept/queryService ,显示下面的页面:

调用成功。大家搭建新项目时需要测试下模块的依赖,否则会影响后面项目代码的结构设计。

项目代码可从Github下载:GitHub - openjweb/cloud at masterOpenJWeb is a java bases low code platform. Contribute to openjweb/cloud development by creating an account on GitHub.icon-default.png?t=O83Ahttps://github.com/openjweb/cloud/tree/master

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MACOS开发、使用常见问题汇总

MACOS常见问题 本文记录使用macos遇到的常见问题&#xff0c;后面会持续更新&#xff0c;觉得有用的可以收藏一下。 打不开xxx.app&#xff0c;因为它来自身份不明的开发者解决方法(开启任何来源) 打开终端&#xff08;Terminal&#xff09;程序 拷贝sudo spctl --master-di…

【实用数据】上市公司数字化转型双重差分准自然实验数据(2007-2022年)

测算方式&#xff1a; 参考《管理评论》丁相安&#xff08;2024&#xff09;老师研究的做法&#xff0c;企业分批逐步推动自身数字化转型是一个很好的准自然实验&#xff0c;这符合双重差分法的使用情境。 因此&#xff0c;本文使用多时点双重差分模型&#xff08;&#xff24…

PostgreSQL常用字符串函数与示例说明

文章目录 coalesce字符串位置(position strpos)字符串长度与大小写转换去掉空格(trim ltrim rtrim)字符串连接(concat)字符串替换简单替换(replace)替换指定位置长度(overlay)正则替换(regexp_replace) 字符串匹配字符串拆分split_part(拆分数组取指定位置的值)string_to_array…

一次需升级系统的wxpython安装(macOS M1)

WARNING: The scripts libdoc, rebot and robot are installed in /Users/用户名/Library/Python/3.8/bin which is not on PATH. 背景&#xff1a;想在macos安装Robot Framework &#xff0c;显示pip3不是最新&#xff0c;更新pip3后显示不在PATH上 参看博主文章末尾 MAC系统…

细说STM32单片机DMA中断收发RTC实时时间并改善其鲁棒性的另一种方法

目录 一、工程配置 二、软件代码 1、软件代码 2、usart.h 3、usart.c 4、rtc.c 三、运行与调试 1、合规的指令 2、proBuffer[0]不是 ‘#’ 或proBuffer[4]不是 ‘;’ 3、指令长度小于5 4、proBuffer[2]或proBuffer[3]至少一个不是数字 5、; 位于proBuffer…

离散数学---概率, 期望

本文根据 MIT 计算机科学离散数学课程整理&#xff08;Lecture 22 ~ Lecture 24&#xff09;。 1 非负整数期望性质 用 N 表示非负整数集合&#xff0c;R 是 N 上的随机变量&#xff0c;则 R 的期望可以表示成&#xff1a; 证明&#xff1a; 换一个形式&#xff0c;把每一列…

AI一键生成原创花卉印花图案——创新与效率的结合

引言 在时尚界&#xff0c;印花图案一直是设计师们表达创意和个性的重要手段。随着人工智能技术的发展&#xff0c;AI在设计领域的应用越来越广泛&#xff0c;其中就包括了一键生成原创花卉印花图案。本文将探讨AI如何帮助设计师们提高效率&#xff0c;同时保持设计的创新性和…

QT实操中遇到的一些(C++)疑惑点汇总

QT实操中 遇到的一些C疑惑点汇总 1.实例化对象的两种方法及其访问方式 1.1 示例 1.2 总结 2.基类成员的访问 2.1 直接访问继承的基类成员 2.1.1示例代码 2.1.2 输出结果 2.2 使用作用域解析符来显式调用基类成员函数 2.2.1 示例代码 2.2.2 输出结果 2.3 使用 this 指针访问基类…

图形学笔记 - 4. 几何 -网格操作和阴影映射

文章目录 网格操作&#xff1a;几何处理细分Loop细分Catmull-Clark细分&#xff08;一般网格&#xff09;网格简化 阴影 Shadows可视化阴影映射阴影映射阴影贴图的问题 网格操作&#xff1a;几何处理 网格细分网格简化网格正则化 网格细分&#xff08;上采样&#xff09; 网…

OBOO鸥柏车载广告屏:28.6寸液晶一体机的技术革新与应用前景

在数字化迅速发展的今天&#xff0c;OBOO鸥柏推出的28.6寸车载长条形液晶广告屏一体机成为了市场的一大亮点。这款产品不仅具有超窄边框的高亮设计&#xff0c;还利用异形激光切割技术&#xff0c;支持多种形状如圆形、方形及三角形展示&#xff0c;极大地提升了商用和工业屏幕…

Spring Cloud Alibaba、Spring Cloud 与 Spring Boot各版本的对应关系

参考spring-cloud-alibaba github wiki说明&#xff1a;版本说明 下面截取说明&#xff1a; 2022.x 分支 2021.x 分支 2.2.x 分支 组件版本关系

Springboot + vue 健身房管理系统项目部署

1、前言 ​ 许多人在拿到 Spring Boot 项目的源码后&#xff0c;不知道如何运行。我以 Spring Boot Vue 健身房管理系统的部署为例&#xff0c;详细介绍一下部署流程。大多数 Spring Boot 项目都可以通过这种方式部署&#xff0c;希望能帮助到大家。 ​ 2、项目查看 ​ 首…

SOL链上的 Meme 生态发展:从文化到创新的融合#dapp开发#

一、引言 随着区块链技术的不断发展&#xff0c;Meme 文化在去中心化领域逐渐崭露头角。从 Dogecoin 到 Shiba Inu&#xff0c;再到更多细分的 Meme 项目&#xff0c;这类基于网络文化的加密货币因其幽默和社区驱动力吸引了广泛关注。作为近年来备受瞩目的区块链平台之一&…

基于大数据爬虫数据挖掘技术+Python的网络用户购物行为分析与可视化平台(源码+论文+PPT+部署文档教程等)

#1024程序员节&#xff5c;征文# 博主介绍&#xff1a;CSDN毕设辅导第一人、全网粉丝50W,csdn特邀作者、博客专家、腾讯云社区合作讲师、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老…

主机管理工具 WGCLOUD v3.5.6 更新了哪些特性

WGCLOUD-v3.5.6 更新说明&#xff0c;2024-11-20发布 1. 新增&#xff0c;个性化采集&#xff0c;查看 2. 新增&#xff0c;支持达梦数据库做数据源来存贮监控数据&#xff0c;查看说明(8) 3. 新增&#xff0c;日志监控支持配置自动处理指令&#xff0c;当发现日志出现告警关键…

设计模式之 享元模式

享元模式&#xff08;Flyweight Pattern&#xff09;是一种结构型设计模式&#xff0c;用于减少系统中对象的数量&#xff0c;从而节省内存和提升性能。它通过共享相同的对象来避免重复创建类似的对象。该模式尤其适用于对象数量庞大、且重复内容较多的场景。 核心思想&#x…

yolov5 数据集分享:纯干货

数据集分享&#xff1a;纯干货 1. 遇见数据集&#xff1a;这是一个国内的数据集搜索引擎&#xff0c;索引了国内外的大部分网站&#xff0c;提供最新的数据集推荐。[遇见数据集网站](https://www.selectdataset.com/) 2. Kaggle&#xff1a;一个领先的数据科学和机器学习爱好者…

如何实现3D模型在线展示、互动和分享?

实现3D模型在线展示、互动和分享&#xff0c;可以通过多种途径和技术手段来完成。以下是一些具体的方法和步骤&#xff1a; 一、选择适合的3D模型展示平台 首先&#xff0c;你需要选择一个支持3D模型在线展示、互动和分享的平台。这些平台通常提供用户友好的界面和工具&#x…

大数据-227 离线数仓 - Flume 自定义拦截器(续接上节) 采集启动日志和事件日志

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; Java篇开始了&#xff01; 目前开始更新 MyBatis&#xff0c;一起深入浅出&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff0…

CANoe录制和回放CAN报文

目录 1、录制报文 2、离线回放 3、在线回放 3.1、在线回放设置 CANoe是一款用于汽车电子测试的工具&#xff0c;它可以模拟CAN网络中的各种设备&#xff0c;并支持CAN报文的录制和回放功能&#xff0c;方便我们远程调试。 1、录制报文 在Measurement Setupk面板点击Loggi…