Javaweb之Maven高级分模块设计与开发的详细解析

1. 分模块设计与开发

1.1 介绍

所谓分模块设计,顾名思义指的就是我们在设计一个 Java 项目的时候,将一个 Java 项目拆分成多个模块进行开发。

1). 未分模块设计的问题

如果项目不分模块,也就意味着所有的业务代码是不是都写在这一个 Java 项目当中。随着这个项目的业务扩张,项目当中的业务功能可能会越来越多。

假如我们开发的是一个大型的电商项目,里面可能就包括了商品模块的功能、搜索模块的功能、购物车模块、订单模块、用户中心等等。这些所有的业务代码我们都在一个 Java 项目当中编写。

此时大家可以试想一下,假如我们开发的是一个大型的电商网站,这个项目组至少几十号甚至几百号开发人员,这些开发人员全部操作这一个 Java 项目。此时大家就会发现我们项目管理和维护起来将会非常的困难。而且大家再来看,假如在我们的项目当中,我们自己定义了一些通用的工具类以及通用的组件,而公司还有其他的项目组,其他项目组也想使用我们所封装的这些组件和工具类,其实是非常不方便的。因为 Java 项目当中包含了当前项目的所有业务代码,所以就造成了这里面所封装的一些组件会难以复用。

总结起来,主要两点问题:不方便项目的维护和管理、项目中的通用组件难以复用。

2). 分模块设计

分模块设计我们在进行项目设计阶段,就可以将一个大的项目拆分成若干个模块,每一个模块都是独立的。

比如我们可以将商品的相关功能放在商品模块当中,搜索的相关业务功能我都封装在搜索模块当中,还有像购物车模块、订单模块。而为了组件的复用,我们也可以将项目当中的实体类、工具类以及我们定义的通用的组件都单独的抽取到一个模块当中。

如果当前这个模块,比如订单模块需要用到这些实体类以及工具类或者这些通用组件,此时直接在订单模块当中引入工具类的坐标就可以了。这样我们就将一个项目拆分成了若干个模块儿,这就是分模块儿设计。

分模块儿设计之后,大家再来看。我们在进行项目管理的时候,我就可以几个人一组,几个人来负责订单模块儿,另外几个人来负责购物车模块儿,这样更加便于项目的管理以及项目的后期维护。

而且分模块设计之后,如果我们需要用到另外一个模块的功能,我们直接依赖模块就可以了。比如商品模块、搜索模块、购物车订单模块都需要依赖于通用组件当中封装的一些工具类,我只需要引入通用组件的坐标就可以了。

分模块设计就是将项目按照功能/结构拆分成若干个子模块,方便项目的管理维护、拓展,也方便模块键的相互调用、资源共享。

1.2 实践

1.2.1 分析

好,我们明白了什么是分模块设计以及分模块设计的优势之后,接下来我们就来看一下我们之前所开发的案例工程。

我们可以看到在这个项目当中,除了我们所开发的部门管理以及员工管理、登录认证等相关业务功能以外,我们是不是也定义了一些实体类,也就是pojo包下存放的一些类,像分页结果的封装类PageBean、 统一响应结果Result,我们还定义了一些通用的工具类,像Jwts、阿里云OSS操作的工具类等等。

如果在当前公司的其他项目组当中,也想使用我们所封装的这些公共的组件,该怎么办?大家可以思考一下。

  • 方案一:直接依赖我们当前项目 tlias-web-management ,但是存在两大缺点:

    • 这个项目当中包含所有的业务功能代码,而想共享的资源,仅仅是pojo下的实体类,以及 utils 下的工具类。如果全部都依赖进来,项目在启动时将会把所有的类都加载进来,会影响性能

    • 如果直接把这个项目都依赖进来了,那也就意味着我们所有的业务代码都对外公开了,这个是非常不安全的。

  • 方案二:分模块设计

    • 将pojo包下的实体类,抽取到一个maven模块中 tlias-pojo

    • 将utils包下的工具类,抽取到一个maven模块中 tlias-utils

    • 其他的业务代码,放在tlias-web-management这个模块中,在该模块中需要用到实体类pojo、工具类utils,直接引入对应的依赖即可。

注意:分模块开发需要先针对模块功能进行设计,再进行编码。不会先将工程开发完毕,然后进行拆分。

PS:当前我们是为了演示分模块开发,所以是基于我们前面开发的案例项目进行拆分的,实际中都是分模块设计,然后再开发的。

1.2.2 实现

思路我们分析完毕,接下来,我们就根据我们分析的思路,按照如下模块进行拆分:

1. 创建maven模块 tlias-pojo,存放实体类

A. 创建一个正常的Maven模块,模块名tlias-pojo

 

B. 然后在tlias-pojo中创建一个包 com.itheima.pojo (和原来案例项目中的pojo包名一致)

C. 将原来案例项目 tlias-web-management 中的pojo包下的实体类,复制到tlias-pojo模块中

D. 在 tlias-pojo 模块的pom.xml文件中引入依赖

<dependencies>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.18.24</version>
    </dependency>
</dependencies>

E. 删除原有案例项目tlias-web-management的pojo包【直接删除不要犹豫,我们已经将该模块拆分出去了】,然后在pom.xml中引入 tlias-pojo的依赖

<dependency>
    <groupId>com.itheima</groupId>
    <artifactId>tlias-pojo</artifactId>
    <version>1.0-SNAPSHOT</version>
</dependency>

2. 创建Maven模块 tlias-utils,存放相关工具类

A. 创建一个正常的Maven模块,模块名tlias-utils

 

B. 然后在 tlias-utils 中创建一个包 com.itheima.utils (和原来案例项目中的utils包名一致)

C. 将原来案例项目 tlias-web-management 中的utils包下的实体类,复制到tlias-utils模块中

D. 在 tlias-utils 模块的pom.xml文件中引入依赖

<dependencies>
    <!--JWT令牌-->
    <dependency>
        <groupId>io.jsonwebtoken</groupId>
        <artifactId>jjwt</artifactId>
        <version>0.9.1</version>
    </dependency>
​
    <!--阿里云OSS-->
    <dependency>
        <groupId>com.aliyun.oss</groupId>
        <artifactId>aliyun-sdk-oss</artifactId>
        <version>3.15.1</version>
    </dependency>
    <dependency>
        <groupId>javax.xml.bind</groupId>
        <artifactId>jaxb-api</artifactId>
        <version>2.3.1</version>
    </dependency>
    <dependency>
        <groupId>javax.activation</groupId>
        <artifactId>activation</artifactId>
        <version>1.1.1</version>
    </dependency>
    <!-- no more than 2.3.3-->
    <dependency>
        <groupId>org.glassfish.jaxb</groupId>
        <artifactId>jaxb-runtime</artifactId>
        <version>2.3.3</version>
    </dependency>
​
    <!--WEB开发-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
        <version>2.7.5</version>
    </dependency>
​
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.18.24</version>
    </dependency>
</dependencies>

E. 删除原有案例项目tlias-web-management的utils包【直接删除不要犹豫,我们已经将该模块拆分出去了】,然后在pom.xml中引入 tlias-utils的依赖

<dependency>
    <groupId>com.itheima</groupId>
    <artifactId>tlias-utils</artifactId>
    <version>1.0-SNAPSHOT</version>
</dependency>

到此呢,就已经完成了模块的拆分,拆分出了 tlias-pojo、tlias-utils、tlias-web-management ,如果其他项目中需要用到 pojo,或者 utils工具类,就可以直接引入依赖。

1.3 总结

1). 什么是分模块设计:将项目按照功能拆分成若干个子模块

2). 为什么要分模块设计:方便项目的管理维护、扩展,也方便模块间的相互调用,资源共享

3). 注意事项:分模块设计需要先针对模块功能进行设计,再进行编码。不会先将工程开发完毕,然后进行拆分

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

如何使用最大努力通知实现分布式事务?与本地消息表区别?

什么是最大努力通知&#xff1f; 最大努力通知&#xff08;Best-Effort Notification&#xff09;是一种在分布式系统中处理分布式事务的方法之一&#xff0c;它强调尽力而为&#xff0c;不保证完全的事务一致性&#xff0c;但可以通过一定的机制来提供部分保证。在最大努力通…

程序员有哪些常用的技术网站呢?

在当今信息化时代&#xff0c;程序员们能够通过互联网接触到许多优秀的技术网站&#xff0c;这些网站为他们提供了丰富的学习资源和交流平台。这些技术网站涵盖了各种软件开发、设计、数据分析和人工智能等领域&#xff0c;为程序员们提供了广阔的学习空间和交流机会。在这篇文…

蓝桥杯[OJ 3412]-最小化战斗力差距-CPP-贪心

目录 一、问题描述&#xff1a; 二、整体思路&#xff1a; 三、代码&#xff1a; 一、问题描述&#xff1a; 二、整体思路&#xff1a; 首先每个值都有可能为min(b)&#xff0c;那么对于每个可能为min(b)的值&#xff0c;要使得max(a)尽可能小&#xff0c;因此枚举所有相差最…

每日学习笔记:C++ STL 的List

定义 特点 操作函数 关于c.merge(c2)的分析&#xff0c;详见&#xff1a; 。。。。 C list merge()用法及代码示例 - 纯净天空 (vimsky.com) 异常安全性 运用实例

Python 导入Excel三维坐标数据 生成三维曲面地形图(面) 4-3、线条平滑曲面(原始颜色)去除无效点

环境和包: 环境 python:python-3.12.0-amd64包: matplotlib 3.8.2 pandas 2.1.4 openpyxl 3.1.2 scipy 1.12.0 代码: import pandas as pd import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D from scipy.interpolate import griddata fro…

Arm MMU深度解读

文章目录 一、MMU概念介绍二、虚拟地址空间和物理地址空间2.1、(虚拟/物理)地址空间的范围2.2、物理地址空间有效位(范围) 三、Translation regimes四、地址翻译/几级页表&#xff1f;4.1、思考&#xff1a;页表到底有几级&#xff1f;4.2、以4KB granule为例&#xff0c;页表的…

抽象工厂模式——创建型模式

抽象工厂模式——创建型模式 抽象工厂模式是一种软件设计模式&#xff0c;它解决了在创建一组相关或相互依赖的对象时的一些核心问题。其核心问题包括&#xff1a; 对象的创建与使用分离&#xff1a; 抽象工厂模式通过引入抽象工厂接口以及具体工厂类&#xff0c;将对象的创建与…

高浓度氨氮废水如何处理达标排放

高浓度氨氮废水的处理和达标排放是环境保护工作中的重要任务之一。随着工业化进程的加速和人们环保意识的增强&#xff0c;如何有效处理高浓度氨氮废水已成为一个迫切需要解决的问题。本文将探讨高浓度氨氮废水的处理方法和技术&#xff0c;以确保其达到排放标准&#xff0c;减…

面向IoT物联网的时间序列引擎

1、背景 随着近年来业务的发展&#xff0c;尤其是机器产生的数据占比越来越高的趋势下&#xff0c;时序数据因为其业务价值越来越被更多地关注&#xff0c;也因而催生了专用的时间序列数据库&#xff0c;简称时序数据库&#xff08;TimeSeries Database&#xff0c;TSDB&#x…

leetcode 热题 100_螺旋矩阵

题解一&#xff1a; 模拟&#xff1a;定义四个边界&#xff0c;指针按右下左上的顺序遍历&#xff0c;每遍历一条边&#xff0c;边界就减一&#xff0c;并且在某个方向没有可以遍历的数时直接返回。 import java.util.ArrayList; import java.util.List;class Solution {publi…

Python中的异常处理及最佳实践【第125篇—异常处理】

Python中的异常处理及最佳实践 异常处理是编写健壮、可靠和易于调试的Python代码中不可或缺的一部分。在本文中&#xff0c;我们将深入探讨Python中的异常处理机制&#xff0c;并分享一些最佳实践和代码示例&#xff0c;以帮助您更好地处理错误情况和提高代码的稳定性。 异常…

【2024泰迪杯】C 题:竞赛论文的辅助自动评阅 问题分析及Python 代码实现

【2024泰迪杯】C 题&#xff1a;竞赛论文的辅助自动评阅 Python 代码实现 2024 年(第 12 届)“泰迪杯”数据挖掘挑战赛 C 题&#xff1a;竞赛论文的辅助自动评阅 1 题目 一、问题背景 近年来我国各领域各层次学科竞赛百花齐放&#xff0c;层出不穷&#xff0c;学生参与度也…

NCDA大赛交互网页设计优秀作品有哪些?

现在&#xff0c;越来越多 UX/UI 设计者将互动 / 在其网站设计中添加动画元素(如鼠标悬停状态、音频或视频媒体、滚动交互等。).这样一方面可以让网站本身更加华丽有趣&#xff0c;吸引更多的访问者&#xff0c;激励访问者更加关注和阅读网站内容。这就是为什么互动网站设计已经…

CFINet

文章目录 AbstractIntroductionContributionsRelated Works锚点细化和区域候选小目标检测的特征模拟目标检测的对比学习MethodTowards Better ProposalsLimitations of Cascade RPNCourse-to-fine RPN(CRPN)Loss Function小目标检测的特征模拟范例特征Feat2Embed ModuleLoss …

speexsdp消除回声

这是testecho.c样例的程序。 初始化函数&#xff1a; SpeexEchoState *speex_echo_state_init(int frame_size, int filter_length); 可以看头文件说明&#xff1a;配置frame_size贞大小10-20ms&#xff0c;filter_length滤波长度100-500ms 比如采样频率是16K&#xff0c;fr…

代码签名的等级有哪些?怎么申请?

代码签名有OV,EV两种安全等级的证书&#xff0c;其中OV代码签名证书与EV代码签名证书的主要区别有以下几点&#xff1a; 1. 验证深度&#xff1a; - OV代码签名证书&#xff1a;进行组织验证&#xff0c;即证书颁发机构&#xff08;CA&#xff09;会验证申请者的公司或组织的真…

笔记本电脑已接通电源但未充电怎么办?这里提供8个解决办法

序言 你的笔记本电脑即使插上电源也不会充电吗?虽然大多数情况下,当充电适配器未正确连接时会发生这种情况,但在其他情况下,过时的BIOS或电池驱动程序损坏可能是原因。无论原因是什么,如果笔记本电脑已插入电源但未充电,你可以尝试以下修复程序。 检查笔记本电脑适配器…

视频怎么转成文字?不妨试试这三款AI神器!

在数字化时代&#xff0c;视频内容日益丰富&#xff0c;但有时我们希望能够轻松提取视频中的文字信息&#xff0c;以便快速浏览、编辑或搜索。这时&#xff0c;一款高效、准确的视频转文字应用就显得尤为重要。面对市面上众多的选择&#xff0c;究竟哪款应用能够脱颖而出&#…

SSL---VPN

文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 一.SSL-VPN概述 SLL VPN是一种基于HTTPS&#xff08;即支持SSL的HTTP协议&#xff09;的远程安全接入技术。它充分利用了SSL协议提供的基于证书的身份认证、数据加密和消息完整性验证机制&#…

xss.haozi.me靶场“0x00-0x0A”通关教程

君衍. 一、靶场介绍二、第一关 0x00 不做限制三、第二关 0x01 文本闭合标签绕过四、第三关 0x02 双引号闭合绕过五、第四关 0x03 过滤括号六、第五关 0x04 编码绕过七、第六关 0x05 注释闭合绕过八、第七关 0x06 换行绕过九、第八关 0x07 删除标签十、第九关 0x08 多加空格绕过…