Spring Boot 是一个基于 Spring 框架的快速开发框架,可以用于构建独立的、生产级别的应用程序。在进行模块化开发时,将应用程序拆分为多个小的、可重用的模块,每个模块负责实现自己的功能。下面是 Spring Boot 模块化开发与项目搭建的流程:
- 确定应用程序的功能需求:首先需要明确应用程序要实现哪些功能,确定各个模块的职责。
- 创建 Maven 项目:使用 Maven 构建工具创建一个空的项目,在 pom.xml 文件中添加 Spring Boot 的依赖。
- 创建父子模块结构:根据应用程序的功能需求,创建多个子模块,并将其作为父模块的子模块。
- 配置父模块:在父模块的 pom.xml 文件中,添加子模块的依赖和统一的配置信息,如日志、数据库等。
- 配置子模块:在子模块的 pom.xml 文件中,添加当前模块的依赖和配置信息,如控制器、服务、存储库、工具类、异常处理等。
- 编写代码:在每个模块中编写相应的代码,实现相应的业务逻辑。
- 测试模块:对每个模块进行单元测试,确保其功能正常,无 bug。
- 打包部署:使用 Maven 打包并部署到服务器上,启动应用程序。
- 配置文件:在每个子模块中添加 application.yml 或者 application.properties 文件,分别配置当前模块所需的属性信息,如数据源、端口号、日志等级等。
- 公共模块:对于多个子模块都需要使用到的工具类、配置信息等,可以将其抽象为一个公共模块,这样就可以避免重复编写代码,提高了代码复用率。
- 拦截器:在子模块中添加拦截器,扩展应用程序的功能,如记录请求日志、权限校验、异常处理等。
- Web 层:在子模块中添加控制器,实现 HTTP 请求和响应,处理 Web 层相关的业务逻辑。
- 服务层:在子模块中添加服务类,封装具体的业务逻辑,被 Web 层调用。
- 存储库层:在子模块中添加存储库接口,用于访问数据库或其他数据存储方式,如 Redis、Elasticsearch 等。
- 异常处理:在子模块中添加异常处理类,处理应用程序中出现的异常情况,如参数校验失败、数据库访问异常等。
使用 Spring Boot 进行模块化开发:
- 创建 Maven 项目,并在 pom.xml 文件中添加 Spring Boot 的依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<version>${spring.boot.version}</version>
</dependency>
- 在项目根目录下创建父模块和子模块:
$ mkdir parent-module
$ cd parent-module
$ mvn archetype:generate -DgroupId=com.example -DartifactId=parent-module -DinteractiveMode=false
$ mkdir child-module-1
$ cd child-module-1
$ mvn archetype:generate -DgroupId=com.example -DartifactId=child-module-1 -DinteractiveMode=false
$ mkdir child-module-2
$ cd child-module-2
$ mvn archetype:generate -DgroupId=com.example -DartifactId=child-module-2 -DinteractiveMode=false
- 配置父模块的 pom.xml 文件:
<modules>
<module>child-module-1</module>
<module>child-module-2</module>
</modules>
- 配置子模块的 pom.xml 文件:
子模块 1:
代码语言:javascript复制<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>${spring.boot.version}</version>
</dependency>
</dependencies>
子模块 2:
代码语言:javascript复制<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
<version>${spring.boot.version}</version>
</dependency>
</dependencies>
- 编写代码:
子模块 1:在 src/main/java/com/example/child_module_1 目录下添加 HelloWorldController.java 文件,实现 HTTP 请求和响应:
代码语言:javascript复制@RestController
public class HelloWorldController {
@GetMapping("/hello")
public String helloWorld() {
return "Hello, World!";
}
}
子模块 2:在 src/main/java/com/example/child_module_2 目录下添加 UserRepository.java 文件,实现对用户表的访问和操作:
代码语言:javascript复制@Repository
public interface UserRepository extends JpaRepository<User, Long> {
List<User> findByAge(int age);
}
- 测试模块:在每个子模块中编写相应的测试用例,确保其功能正常,无 bug。
- 打包部署:使用 Maven 打包并部署到服务器上,启动应用程序。
Spring Boot Starter Data JPA是一个Spring Boot的starter,它为使用Java Persistence API(JPA)和Hibernate ORM框架的开发者提供了便利。JPA是一个标准化的ORM框架,它提供了一种将Java对象映射到关系数据库中的方法,从而使开发人员可以使用面向对象的方式来操作数据。
Spring Boot Starter Data JPA提供了自动配置,包括:
- 数据源的配置
- 实体管理器的配置
- 事务管理的配置
通过简单地添加Spring Boot Starter Data JPA依赖项,您就可以快速地在Spring Boot应用程序中启用JPA功能,并开始使用Hibernate ORM框架。
此外,Spring Boot Starter Data JPA还支持其他功能,如:
- Spring Data JPA:提供了一组易于使用的存储库接口,用于访问数据库,并提供分页、排序、查询构建等功能。
- Spring Data REST:为Spring Data存储库提供RESTful API。
- Spring Batch:提供了批处理作业处理的支持。
- Flyway和Liquibase:提供了数据库迁移的支持,可以轻松地管理数据库模式的变更。
<repositories>
<repository>
<id>public</id>
<name>aliyun nexus</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<releases>
<enabled>true</enabled>
</releases>
</repository>
</repositories>
这是一个 Maven 的配置文件,它定义了一个 Maven 仓库的位置和相关信息。
具体来说,这个配置文件中包含了一个元素,表示定义一个仓库。在这个元素下面,又有一个元素,表示定义一个仓库的详细信息。
这个仓库的 id 是 "public",名称是 "aliyun nexus",URL 是 http://maven.aliyun.com/nexus/content/groups/public/,表示这个仓库存储在阿里云的 Nexus 服务器上,并且可以通过这个 URL 地址访问。
在 <releases>
元素下面,<enabled>
元素设置为 true,表示这个仓库允许发布 release 版本的构件。也就是说,当一个 Maven 项目需要使用这个仓库中的某个构件时,它会先查找该仓库是否存在这个构件,如果存在则下载并使用;如果不存在,则会去其他配置的仓库中查找。
<pluginRepositories>
<pluginRepository>
<id>public</id>
<name>aliyun nexus</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
</pluginRepository>
</pluginRepositories>
这是一个 Maven 的配置文件,用于配置 Maven 插件的仓库信息。
具体来说,这个配置文件中包含了一个 <pluginRepositories>
元素,表示定义了一个插件仓库。在这个元素下面,又有一个 <pluginRepository>
元素,表示定义了一个插件仓库的详细信息。
这个插件仓库的 id 是 "public",名称是 "aliyun nexus",URL 是 http://maven.aliyun.com/nexus/content/groups/public/,表示这个插件仓库存储在阿里云的 Nexus 服务器上,并且可以通过这个 URL 地址访问。
在 <releases>
元素下面,<enabled>
元素设置为 true,表示这个插件仓库允许发布 release 版本的插件;在 <snapshots>
元素下面,<enabled>
元素设置为 false,表示这个插件仓库不允许发布 snapshot 版本的插件。
Maven 插件仓库和构件仓库类似,不同之处在于它们分别存放不同类型的文件。插件仓库主要用于存放 Maven 插件的相关信息和代码,而构件仓库则主要用于存放项目的编译结果(如 jar、war 等文件)。
代码语言:javascript复制<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-text</artifactId>
<version>1.10.0</version>
</dependency>
这是一个 Maven 项目中用来声明依赖的配置,表示该项目依赖于 org.apache.commons 组织下的 commons-text 模块,版本号为 1.10.0。
具体来说,组织名和模块名分别对应 Maven 仓库中的目录结构,因此 Maven 可以通过这些信息找到并下载需要的依赖包。在本例中,commons-text 模块提供了 Apache Commons Text 库的实现,可以用于处理文本相关操作,如字符串处理、格式化等。
在 Maven 中,依赖声明的格式通常为 <groupId>:<artifactId>:<version>
,表示依赖的组织、模块及其版本信息。Maven 会根据依赖信息自动下载所需的依赖包,并将其添加到项目的 classpath 中,以便在代码中调用相应的类和方法。
<!--mapStruct依赖-->
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
<version>${mapstruct.version}</version>
</dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>${mapstruct.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.inject</groupId>
<artifactId>javax.inject</artifactId>
<version>1</version>
</dependency>
这是一个 Maven 项目的 pom.xml 文件中的一些依赖项配置。Maven 是一个 Java 的构建工具,可以自动化项目的构建和依赖项管理。
这里列出了三个依赖项:
org.mapstruct:mapstruct
是 MapStruct 库的依赖项,它是一个 Java Bean 映射库,用于简化两个对象之间的映射。${mapstruct.version}
是一个变量,将在 Maven 配置文件中设置它的值。org.mapstruct:mapstruct-processor
也是 MapStruct 库的依赖项。该库提供了编译时生成代码的功能,以便进行更好的类型检查和保证正确性。<scope>
元素设置为 "provided",表示这个依赖项由编译器或部署环境提供,而不是由 Maven 提供。javax.inject:javax.inject
是 JSR-330 (依赖注入规范) 的实现,它包含了注解和接口,可以轻松地实现依赖注入模式。
POM 文件的详细代码解释:
代码语言:javascript复制<?xml version="1.0" encoding="UTF-8"?>
<!-- 定义 Maven POM 模型的版本 -->
<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">
<!-- 定义该 POM 的模型版本号 -->
<modelVersion>4.0.0</modelVersion>
<!-- 定义项目坐标,即组织名、项目名和版本号 -->
<groupId></groupId>
<artifactId></artifactId>
<version></version>
<!-- 定义项目打包方式为 pom,表示该项目不生成 jar 或 war 包 -->
<packaging>pom</packaging>
<!-- 定义 maven 多模块项目中的模块名称,可以是多个子模块 -->
<modules>
<module>common</module>
<module>logging</module>
</modules>
<!-- 定义该项目的名称和 URL -->
<name></name>
<url></url>
<!-- 定义该 POM 的父级 POM,定义一些公共配置 -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.6.4</version>
</parent>
<!-- 定义一些属性值,便于后面引用 -->
<properties>
<log4j2.version>2.17.0</log4j2.version>
<logback.version>1.2.9</logback.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<log4jdbc.version>1.16</log4jdbc.version>
<swagger.version>2.9.2</swagger.version>
<fastjson.version>1.2.83</fastjson.version>
<druid.version>1.2.8</druid.version>
<commons-pool2.version>2.11.1</commons-pool2.version>
<mapstruct.version>1.4.2.Final</mapstruct.version>
</properties>
<!-- 项目所需的依赖库 -->
<dependencies>
<!--Spring boot 核心-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<!--Spring boot Web容器-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--Spring boot 测试-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!--Spring boot 安全框架-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<!-- spring boot 缓存 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
<!--Spring boot Redis-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!--spring boot 集成redis所需common-pool2-->
<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-pool2 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
<version>${commons-pool2.version}</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.13.0</version>
</dependency>
<!--hibernate-validator-->
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
<version>6.2.0.Final</version>
</dependency>
<!--mysql数据库驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.27</version>
</dependency>
<!--Druid连接池-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>${druid.version}</version>
</dependency>
<!--MyBatis Plus-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.3</version>
</dependency>
<!--FastJson-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>${fastjson.version}</version>
</dependency>
<!--Swagger-->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>${swagger.version}</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>${swagger.version}</version>
</dependency>
<!--MapStruct-->
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
<version>${mapstruct.version}</version>
</dependency>
<!--Lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<!--Log4j2-->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>${log4j2.version}</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
<version>${log4j2.version}</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-web</artifactId>
<version>${log4j2.version}</version>
</dependency>
<!--Logback-->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>${logback.version}</version>
</dependency>
<dependency>
<groupId>net.logstash.logback</groupId>
<artifactId>logstash-logback-encoder</artifactId>
<version>6.6</version>
</dependency>
</dependencies>
<!-- 定义构建相关的配置信息 -->
<build>
<!-- 指定打包时跳过测试阶段 -->
<skipTests>true</skipTests>
</build>
<!-- 定义 Maven 仓库 -->
<repositories>
<repository>
<id>aliyun</id>
<url>https://maven.aliyun.com/repository/public</url>
</repository>
</repositories>
<!-- 定义 Maven 插件仓库 -->
<pluginRepositories>
<pluginRepository>
<id>aliyun-plug</id>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
</pluginRepository>
</pluginRepositories>
</project>
archetype是什么
在Spring Boot中,Archetype是一个项目模板,它定义了项目的结构、依赖和其他配置。当您创建一个新的Spring Boot项目时,可以使用Archetype来快速设置项目的基本结构和依赖。
选择合适的Archetype
取决于您的需求和项目类型。例如,如果您正在开发一个Web应用程序,可以选择Spring Boot Web Archetype
;如果您正在开发一个RESTful API,可以选择Spring Boot RESTful Service Archetype
。除此之外,还有一些Archetype用于测试、安全等方面。
您可以在Maven仓库中找到Spring Boot Archetype。要使用它们,请使用Maven命令行工具或集成开发环境(IDE)中提供的功能从Archetype生成新项目。
总结:
Spring Boot是一个基于Spring框架的开发框架,它可以快速构建应用程序并支持模块化开发。下面是Spring Boot模块化开发与项目搭建的流程:
- 确定项目需求:确定项目的需求和功能,包括数据库设计,用户界面设计等。
- 创建Maven项目:使用Maven创建Spring Boot项目,并添加所需要的依赖。在pom.xml文件中指定Spring Boot的版本以及其他依赖项。
- 配置数据库:配置Spring Boot与数据库的连接,使用Spring Data JPA进行数据访问操作。
- 添加模块:根据需求添加所需要的模块,例如Web模块、Security模块等。每个模块都需要在pom.xml文件中声明所需的依赖。
- 设计API接口:根据需求设计RESTful API接口,并编写相应的Controller层代码。
- 实现业务逻辑:在Service层实现业务逻辑,并将其注入到Controller中。
- 编写测试代码:编写单元测试和集成测试代码,确保项目的正确性和安全性。
- 打包部署:使用Maven打包项目,并将其部署到服务器上。
以上是Spring Boot模块化开发与项目搭建的大致流程,具体实现过程会因项目需求和场景而有所不同。