likes
comments
collection
share

springboot第4集:springboot模块化开发与项目搭建流程

作者站长头像
站长
· 阅读数 22

Spring Boot 是一个基于 Spring 框架的快速开发框架,可以用于构建独立的、生产级别的应用程序。在进行模块化开发时,将应用程序拆分为多个小的、可重用的模块,每个模块负责实现自己的功能。下面是 Spring Boot 模块化开发与项目搭建的流程:

  1. 确定应用程序的功能需求:首先需要明确应用程序要实现哪些功能,确定各个模块的职责。
  2. 创建 Maven 项目:使用 Maven 构建工具创建一个空的项目,在 pom.xml 文件中添加 Spring Boot 的依赖。
  3. 创建父子模块结构:根据应用程序的功能需求,创建多个子模块,并将其作为父模块的子模块。
  4. 配置父模块:在父模块的 pom.xml 文件中,添加子模块的依赖和统一的配置信息,如日志、数据库等。
  5. 配置子模块:在子模块的 pom.xml 文件中,添加当前模块的依赖和配置信息,如控制器、服务、存储库、工具类、异常处理等。
  6. 编写代码:在每个模块中编写相应的代码,实现相应的业务逻辑。
  7. 测试模块:对每个模块进行单元测试,确保其功能正常,无 bug。
  8. 打包部署:使用 Maven 打包并部署到服务器上,启动应用程序。
  9. 配置文件:在每个子模块中添加 application.yml 或者 application.properties 文件,分别配置当前模块所需的属性信息,如数据源、端口号、日志等级等。
  10. 公共模块:对于多个子模块都需要使用到的工具类、配置信息等,可以将其抽象为一个公共模块,这样就可以避免重复编写代码,提高了代码复用率。
  11. 拦截器:在子模块中添加拦截器,扩展应用程序的功能,如记录请求日志、权限校验、异常处理等。
  12. Web 层:在子模块中添加控制器,实现 HTTP 请求和响应,处理 Web 层相关的业务逻辑。
  13. 服务层:在子模块中添加服务类,封装具体的业务逻辑,被 Web 层调用。
  14. 存储库层:在子模块中添加存储库接口,用于访问数据库或其他数据存储方式,如 Redis、Elasticsearch 等。
  15. 异常处理:在子模块中添加异常处理类,处理应用程序中出现的异常情况,如参数校验失败、数据库访问异常等。

使用 Spring Boot 进行模块化开发:

  1. 创建 Maven 项目,并在 pom.xml 文件中添加 Spring Boot 的依赖:
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
    <version>${spring.boot.version}</version>
</dependency>
  1. 在项目根目录下创建父模块和子模块:
$ 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
  1. 配置父模块的 pom.xml 文件:
<modules>
    <module>child-module-1</module>
    <module>child-module-2</module>
</modules>
  1. 配置子模块的 pom.xml 文件:

子模块 1:

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
        <version>${spring.boot.version}</version>
    </dependency>
</dependencies>

子模块 2:

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
        <version>${spring.boot.version}</version>
    </dependency>
</dependencies>
  1. 编写代码:

子模块 1:在 src/main/java/com/example/child_module_1 目录下添加 HelloWorldController.java 文件,实现 HTTP 请求和响应:

@RestController
public class HelloWorldController {

    @GetMapping("/hello")
    public String helloWorld() {
        return "Hello, World!";
    }

}

子模块 2:在 src/main/java/com/example/child_module_2 目录下添加 UserRepository.java 文件,实现对用户表的访问和操作:

@Repository
public interface UserRepository extends JpaRepository<User, Long> {

    List<User> findByAge(int age);

}
  1. 测试模块:在每个子模块中编写相应的测试用例,确保其功能正常,无 bug。
  2. 打包部署:使用 Maven 打包并部署到服务器上,启动应用程序。

Spring Boot Starter Data JPA是一个Spring Boot的starter,它为使用Java Persistence API(JPA)和Hibernate ORM框架的开发者提供了便利。JPA是一个标准化的ORM框架,它提供了一种将Java对象映射到关系数据库中的方法,从而使开发人员可以使用面向对象的方式来操作数据。

Spring Boot Starter Data JPA提供了自动配置,包括:

  1. 数据源的配置
  2. 实体管理器的配置
  3. 事务管理的配置

通过简单地添加Spring Boot Starter Data JPA依赖项,您就可以快速地在Spring Boot应用程序中启用JPA功能,并开始使用Hibernate ORM框架。

此外,Spring Boot Starter Data JPA还支持其他功能,如:

  1. Spring Data JPA:提供了一组易于使用的存储库接口,用于访问数据库,并提供分页、排序、查询构建等功能。
  2. Spring Data REST:为Spring Data存储库提供RESTful API。
  3. Spring Batch:提供了批处理作业处理的支持。
  4. 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 是 maven.aliyun.com/nexus/conte… 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 是 maven.aliyun.com/nexus/conte… Nexus 服务器上,并且可以通过这个 URL 地址访问。

<releases> 元素下面,<enabled> 元素设置为 true,表示这个插件仓库允许发布 release 版本的插件;在 <snapshots> 元素下面,<enabled> 元素设置为 false,表示这个插件仓库不允许发布 snapshot 版本的插件。

Maven 插件仓库和构件仓库类似,不同之处在于它们分别存放不同类型的文件。插件仓库主要用于存放 Maven 插件的相关信息和代码,而构件仓库则主要用于存放项目的编译结果(如 jar、war 等文件)。

<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 的构建工具,可以自动化项目的构建和依赖项管理。

这里列出了三个依赖项:

  1. org.mapstruct:mapstruct 是 MapStruct 库的依赖项,它是一个 Java Bean 映射库,用于简化两个对象之间的映射。${mapstruct.version} 是一个变量,将在 Maven 配置文件中设置它的值。
  2. org.mapstruct:mapstruct-processor 也是 MapStruct 库的依赖项。该库提供了编译时生成代码的功能,以便进行更好的类型检查和保证正确性。<scope> 元素设置为 "provided",表示这个依赖项由编译器或部署环境提供,而不是由 Maven 提供。
  3. javax.inject:javax.inject 是 JSR-330 (依赖注入规范) 的实现,它包含了注解和接口,可以轻松地实现依赖注入模式。

POM 文件的详细代码解释:

<?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模块化开发与项目搭建的流程:

  1. 确定项目需求:确定项目的需求和功能,包括数据库设计,用户界面设计等。
  2. 创建Maven项目:使用Maven创建Spring Boot项目,并添加所需要的依赖。在pom.xml文件中指定Spring Boot的版本以及其他依赖项。
  3. 配置数据库:配置Spring Boot与数据库的连接,使用Spring Data JPA进行数据访问操作。
  4. 添加模块:根据需求添加所需要的模块,例如Web模块、Security模块等。每个模块都需要在pom.xml文件中声明所需的依赖。
  5. 设计API接口:根据需求设计RESTful API接口,并编写相应的Controller层代码。
  6. 实现业务逻辑:在Service层实现业务逻辑,并将其注入到Controller中。
  7. 编写测试代码:编写单元测试和集成测试代码,确保项目的正确性和安全性。
  8. 打包部署:使用Maven打包项目,并将其部署到服务器上。

以上是Spring Boot模块化开发与项目搭建的大致流程,具体实现过程会因项目需求和场景而有所不同。