Spring Boot 项目新增 Module 完整指南

1. 模块化开发的重要性

在软件开发中,随着项目规模的不断扩大,​​模块化设计​​已成为提高代码可维护性和可复用性的关键实践。通过将大型项目拆分为多个独立模块,开发团队可以​​并行开发​​不同功能组件,降低代码耦合度,并提高整体开发效率。Spring Boot框架提供了良好的支持,使开发者能够轻松创建和管理多模块项目。

模块化开发允许每个模块专注于特定业务功能或技术层面,例如将数据访问层、业务逻辑层和Web层分离为独立模块。这种架构使得代码组织更加清晰,测试更加方便,并且有利于团队协作。

2. 创建父项目(Parent Project)

创建多模块项目首先需要建立一个​​父项目​​作为整个项目的基础容器。父项目不包含具体业务代码,而是负责统一管理所有子模块的依赖和配置。

2.1 初始化父项目

使用Spring Initializr创建父项目,选择Maven作为构建工具,Java作为开发语言,并选择最新的Spring Boot稳定版本。创建完成后,需要修改父项目的pom.xml文件:

<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.example</groupId><artifactId>parent-project</artifactId><version>1.0-SNAPSHOT</version><packaging>pom</packaging><modules><module>moduleA</module><module>moduleB</module></modules><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.2.0</version><relativePath/></parent><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build>
</project>

关键配置说明:

• ​​packaging类型​​:必须设置为pom,表示这是一个父项目

• modules标签​​:包含所有子模块的列表

• ​​parent标签​​:继承Spring Boot官方父项目,获得默认配置

2.2 清理父项目结构

由于父项目不包含实际代码,需要删除不必要的文件和文件夹:

• 删除.mvn文件夹和src目录

• 删除mvnw和mvnw.cmd文件

• 只保留pom.xml文件进行依赖管理

3. 新增子模块(Module)

3.1 创建子模块步骤

在父项目基础上新增子模块的流程如下:

  1. 在IDE中右键点击父项目,选择"New" → “Module”

  2. 选择Spring Initializr作为模块模板

  3. 设置子模块的GroupId和ArtifactId(不要与父项目重复)

  4. 选择所需的Spring Boot起步依赖

  5. 指定模块名称和存储路径

3.2 子模块pom.xml配置

每个子模块需要有独立的pom.xml文件,配置如下:

<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><artifactId>moduleA</artifactId><packaging>jar</packaging><parent><groupId>com.example</groupId><artifactId>parent-project</artifactId><version>1.0-SNAPSHOT</version></parent><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId></dependency><!-- 其他模块依赖 --><dependency><groupId>com.example</groupId><artifactId>common-module</artifactId><version>1.0-SNAPSHOT</version></dependency></dependencies>
</project>

子模块配置要点:

• ​​parent配置​​:必须指向父项目

• packaging类型​​:通常设置为jar

• 依赖声明​​:添加模块特定需要的依赖

4. 模块间的依赖管理

4.1 统一依赖管理

在父项目中可以统一管理所有子模块的依赖版本,避免版本冲突:

<!-- 父项目pom.xml中 -->
<properties><java.version>17</java.version><lombok.version>1.18.30</lombok.version><mysql.version>8.0.33</mysql.version><!-- 统一管理项目版本号 --><parentProject.version>1.0-SNAPSHOT</parentProject.version>
</properties><dependencyManagement><dependencies><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>${lombok.version}</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>${mysql.version</version></dependency></dependencies><!-- 子模块版本管理 --><dependency><groupId>com.example</groupId><artifactId>moduleA</artifactId><version>${parentProject.version}</version></dependency>
</dependencyManagement>

4.2 模块间依赖引用

一个模块可以依赖其他模块,只需在pom.xml中添加对应模块的依赖:

<dependency><groupId>com.example</groupId><artifactId>moduleA</artifactId><version>1.0-SNAPSHOT</version>
</dependency>

这样,moduleB就可以使用moduleA中定义的类和服务了。

5. 模块配置与自定义属性

5.1 模块特定配置

每个模块可以有自己独立的配置文件(application.yml或application.properties),用于设置模块特定的属性:

# moduleA/src/main/resources/application.yml
server:port: 8081spring:datasource:url: jdbc:mysql://localhost:3306/moduleA_dbusername: rootpassword: passwordcustom:module:setting: value-specific-to-moduleA

5.2 跨模块配置共享

使用Spring Boot的@ConfigurationProperties注解,可以创建能够在多个模块间共享的配置类:

// 在common模块中定义
@Component
@ConfigurationProperties(prefix = "sky.aa")
@Data
public class AA {private String name;private String age;
}

在其他模块中,只需在配置文件中设置相应属性即可注入使用:

# 在使用模块的application.yml中
sky:aa:name: zhanage: 12

这种机制使得配置能够在模块间共享和重用。

6. 代码实现示例

6.1 创建模块服务类

在每个模块中,可以创建特定的服务类实现业务逻辑:

package com.example.moduleA;import org.springframework.stereotype.Service;@Service
public class MyService {public String getGreeting() {return "Hello from Module A!";}
}

6.2 创建REST控制器

package com.example.mymodule.controller;import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping("/api/hello")
public class HelloController {@GetMappingpublic String sayHello() {return "Hello from My Module!";}
}

6.3 主应用类

每个可独立运行的模块需要有自己的主应用类:

package com.example.moduleA;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}
}

7. 构建与测试

7.1 项目构建

使用Maven命令构建整个项目:

# 在父项目目录下执行
mvn clean install

此命令会编译所有模块,运行测试,并安装到本地Maven仓库。

7.2 运行特定模块

要运行特定模块,可以进入模块目录并使用Spring Boot插件:

cd moduleA
mvn spring-boot:run

或者直接在IDE中运行模块的主应用类。

7.3 测试模块间依赖

在依赖其他模块的模块中,可以测试依赖是否正常工作:

import com.example.modulea.ServiceA;@Service
public class ServiceB {private final ServiceA serviceA;public ServiceB(ServiceA serviceA) {this.serviceA = serviceA;}public void performAction() {serviceA.action();}
}

8. 常见问题与解决方案

8.1 模块无法识别问题

如果新模块未被正确识别,检查父pom.xml中的modules配置是否包含了新模块,并确保子模块的parent配置正确指向父项目。

8.2 依赖版本冲突

使用父项目中的dependencyManagement统一管理依赖版本,避免不同模块使用不同版本的依赖库。

8.3 配置不生效

确保模块的配置文件放置在src/main/resources目录下,并且配置属性前缀与@ConfigurationProperties注解中设置的前缀一致。

8.4 类无法扫描问题

如果模块中的组件未被Spring扫描到,检查主应用类是否在包的根目录下,或者使用@ComponentScan注解明确指定要扫描的包。

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

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

相关文章

Git cherry-pick 与分支重置技术实现代码健全性保障下的提交记录精简

代码健全性保障&#xff1a;上市审查中的 Git 提交记录整理方案&#xff08;核心功能提交筛选流程&#xff09; 一、背景与目的 我司正处于上市筹备阶段&#xff0c;券商需对核心系统进行 Git 代码审查&#xff0c;并基于提交记录生成测试报告。由于原始提交记录包含大量细节性…

前后端联调时出现的一些问题记录

服务器的ip没有设置成所有ip都能访问的&#xff0c;或防火墙没开跨域问题&#xff08;刚开始异源&#xff0c;有这个问题&#xff0c;主要是前端做一下配置代理&#xff0c;后端也可以配置跨域资源共享&#xff08;CORS&#xff09;&#xff09;Configuration public class Cor…

数字图像处理-设计生成一个半球

1 实验题目设计生成一个半球&#xff08;matlab&#xff09;。2 程序源代码%Hemisphere clear,clc,close all %Sphere radius R1; %Set grid number n30; theta (-n:2:n)/n*pi; phi ([0,0:2:n])/n*pi/2; cosphi cos(phi); cosphi(1) 0; cosphi(end) 0; sintheta sin(thet…

mac M1上安装windows虚拟机报错

Parallels版本是18.0.02 mac&#xff1a;arm系统15.6.1 自动获取windows11下载&#xff0c;安装的时候报错&#xff0c;蓝屏&#xff0c;是因为安装的版本不对&#xff0c;猜测原因应该是18.0.02不支持最新版的windows11&#xff0c;需要更新最新版的Parallels。 解决方案&am…

基于R语言机器学习方法在生态经济学领域中的实践技术应用

近年来&#xff0c;人工智能领域已经取得突破性进展&#xff0c;对经济社会各个领域都产生了重大影响&#xff0c;结合了统计学、数据科学和计算机科学的机器学习是人工智能的主流方向之一&#xff0c;目前也在飞快的融入计量经济学研究。表面上机器学习通常使用大数据&#xf…

第01章 初识MySQL与mysql8.0的安装

初识 MySQL 文章目录初识 MySQL引言一、数据库基础1.1 什么是数据库1.2 表1.3 数据类型1.4 主键二、数据库技术构成2.1 数据库系统2.2 SQL 语言2.2.1 数据定义语言&#xff08;DDL&#xff09;2.2.2 数据操作语言&#xff08;DML&#xff09;2.2.3 数据查询语言&#xff08;DQL…

【数据结构基础习题】-1- 数据结构基本操作

一、顺序表和链表习题 1. 顺序表就地逆置#include <stdio.h> // 定义顺序表结构 #define MAXSIZE 100 typedef struct {int data[MAXSIZE];int length; } SqList; // 就地逆置顺序表 void reverseList(SqList *L) {int i, temp;for (i 0; i < L->length / 2; i) {…

【Java实战㉞】从0到1:Spring Boot Web开发与接口设计实战

目录一、Spring Boot Web 基础配置1.1 Web 起步依赖&#xff08;spring-boot-starter-web 导入与核心组件&#xff09;1.2 内置服务器配置&#xff08;Tomcat 端口、线程池、连接超时设置&#xff09;1.3 静态资源访问&#xff08;静态资源存放路径、自定义资源映射&#xff09…

房屋安全鉴定机构评价

房屋安全鉴定机构评价&#xff1a;如何选择专业可靠的检测服务在建筑行业快速发展的今天&#xff0c;房屋安全鉴定已成为保障建筑安全、预防事故的重要环节。面对市场上众多的房屋安全鉴定机构&#xff0c;如何科学评价并选择一家专业可靠的服务提供方&#xff0c;是许多业主、…

【算法专题训练】19、哈希表

1、哈希表基础知识 以键值对的方式进行数据存储优点&#xff1a;哈希表数据结构在插入、删除或查找一个元素时&#xff0c;都只需要O(1)的时间 哈希表设计三要点&#xff1a; 为了快速确定一个元素在哈希表中的位置&#xff0c;可以使用一个数组&#xff0c;元素的位置为他的…

某光伏电力监控系统网络安全监测项目:智能组网技术优化方案实践

背景与挑战随着光伏电力行业的快速发展&#xff0c;光伏电站的规模和分布范围日益扩大。电力监控系统作为光伏电站的核心平台&#xff0c;其网络安全直接关系到电力生产的稳定性与可靠性。然而&#xff0c;光伏场站通常分布在偏远地区&#xff0c;网络环境复杂&#xff0c;传统…

GEE训练教程:基于Landsat 8卫星影像识别并提取指定区域内无云覆盖的区域多边形,最终导出为矢量文件

简介 本文使用Google Earth Engine平台,通过Landsat 8卫星影像识别并提取指定区域内无云覆盖的区域多边形,最终导出为矢量文件。主要步骤包括:定义研究区域、创建云检测算法、筛选高质量影像、将无云区域转换为矢量多边形,并进行可视化检查和数据导出。 使用Google Earth…

UniApp 页面通讯方案全解析:从 API 到状态管理的最佳实践

在 UniApp 跨端开发中&#xff0c;组件与页面间的通讯是核心需求。无论是父子组件交互、跨页面数据传递&#xff0c;还是全局状态共享&#xff0c;选择合适的通讯方案直接影响代码的可维护性和性能。本文将系统对比 uni.$emit 系列 API、状态管理库&#xff08;Vuex/Pinia&…

【c++进阶系列】:万字详解AVL树(附源码实现)

&#x1f525; 本文专栏&#xff1a;c &#x1f338;作者主页&#xff1a;努力努力再努力wz &#x1f4aa; 今日博客励志语录&#xff1a; 路在脚下延伸时&#xff0c;不必追问终点何在。你迈出的每一步&#xff0c;都在重新定义世界的边界 ★★★ 本文前置知识&#xff1a; …

前端日志回捞系统的性能优化实践|得物技术

一、前言在现代前端应用中&#xff0c;日志回捞系统是排查线上问题的重要工具。然而&#xff0c;传统的日志系统往往面临着包体积过大、存储无限膨胀、性能影响用户体验等问题。本文将深入分析我们在dw/log和dw/log-upload两个库中实施的关键性能优化&#xff0c;以及改造过程中…

【QT随笔】结合应用案例一文完美概括QT中的队列(Queue)

【QT随笔】结合应用案例一文完美概括QT中的队列&#xff08;Queue&#xff09; 队列&#xff08;Queue&#xff09;是一种线性数据结构&#xff0c;其核心规则为先进先出&#xff08;FIFO, First-In-First-Out&#xff09;&#xff1a; 新元素在队尾插入&#xff08;enqueue&a…

At least one <template> or <script> is required in a single file component

环境rspack vue3原因rule 中配置了两个vue-loader删掉一个即可。

LangChain实战(十八):构建ReAct模式的网页内容摘要与分析Agent

本文是《LangChain实战课》系列的第十八篇,将深入讲解如何构建一个基于ReAct模式的智能网页内容摘要与分析Agent。这个Agent能够自主浏览网页、提取关键信息、生成智能摘要,并进行深入的内容分析,让信息获取和理解变得更加高效。 前言 在信息爆炸的时代,我们每天都需要处理…

debian11 ubuntu24 armbian24 apt install pure-ftpd被动模式的正确配置方法

debian11 ubuntu24 armbian24 apt install pure-ftpd被动模式的正确配置方法 安装方法请看&#xff1a;https://www.itbulu.com/pure-ftpd.html 疑难问题解决 原本以为配置很简单的&#xff0c;无非是修改 ForcePassiveIP MinUID PassivePortRange PureDB这几个配置项就行了…

量化金融|基于算法和模型的预测研究综述

一、研究背景与发展历程​​1.​​量化投资理论演进​​•奠基阶段&#xff08;1950s-1960s&#xff09;​​&#xff1a;Markowitz均值方差理论&#xff08;1952&#xff09;、CAPM模型&#xff08;1964&#xff09;奠定现代量化投资基础•衍生品定价&#xff08;1970s-1980s&…