Графический учебник SpringBoot 16 - Многомодульная разработка SpringBoot «веб» «пакет»

Java
Графический учебник SpringBoot 16 - Многомодульная разработка SpringBoot «веб» «пакет»

Если у вас есть концепция полета в небе, у вас должна быть реализация приземления.

  • Концепция десять раз не так хороша, как код один раз, друг, надеюсь, ты сможешь один раз набрать все кодовые случаи в тексте.

  • Сначала лайк, потом смотри, вырабатывай привычку

Каталог статей серии графических руководств по SpringBoot

  1. SpringBoot Graphic Tutorial 1 — SpringBoot + Mybatis Environment Construction
  2. Графический учебник SpringBoot 2 — использование журналов «logback» «log4j»
  3. SpringBoot Graphic Tutorial 3 - Интегрированный Jsp «Комплекс первой любви»
  4. Графический учебник SpringBoot 4 — SpringBoot реализует загрузку и скачивание файлов.
  5. SpringBoot Graphic Tutorial 5 — Использование Aop в SpringBoot
  6. Графический учебник SpringBoot 6 - использование фильтров в SpringBoot
  7. Графический учебник SpringBoot 7 - использование перехватчика SpringBoot
  8. Графический учебник SpringBoot 8 - встроенный в SpringBoot «генератор кода» MBG
  9. Графический учебник SpringBoot 9 - Импорт и экспорт SpringBoot Excel "Apache Poi"
  10. Графический учебник SpringBoot 10 - экспорт шаблонов | экспорт миллионов данных в Excel | экспорт изображений "easypoi"
  11. Графический учебник SpringBoot 11 - с этого момента файл сопоставления не будет записываться «SpringBoot интегрировал MybatisPlus»
  12. SpringBoot Graphic Tutorial 12 — Базовое использование SpringData Jpa
  13. Графический учебник SpringBoot 13 — SpringBoot + IDEA реализует горячее развертывание кода
  14. SpringBoot Graphic and Text Tutorial 14 - Alibaba EasyExcel с открытым исходным кодом «Предназначен для чтения и записи миллионов данных»
  15. Графический учебник SpringBoot 15 — что делать, если проект ненормальный? «Перейти к странице с ошибкой 404» «Глобальный захват исключений»

предисловие

Эта статья включена в облачное хранилище кода: https://gitee.com/bingqilinpeishenme/Java-Tutorials.
В этой статье указан адрес загрузки исходного кода: https://gitee.com/bingqilinpeishenme/multi-module-demo.

Что такое многомодульная разработка? Как показано на рисунке, каждый пакет в проекте соответствует полному проекту, который в IDEA называется модулем, и каждый модуль имеет полную структуру проекта: независимый файл pom, независимый файл конфигурации, независимые модули вывода файла компиляции и т. д.

Итак, как создается проект с такой структурой проекта?

Многомодульная разработка SpringBoot

Технический отбор:

Разработка родительского проекта

Родительский проект можно использовать для унифицированного управления зависимостями всех проектов.Как показано на рисунке, если в родительском проекте есть зависимость mysql, то все подпроекты, наследующие этот родительский проект, также будут наследовать зависимость mysql.

1. Создайте проект

2. Выполните базовую настройку проекта для IDEA.

  • Конфигурация кодировки символов

  • Аннотация вступает в силу

  • Выбор версии компиляции Java

3. Запишите файл pom родительского проекта

См. комментарии для получения подробной информации о файле pom.

<?xml version="1.0" encoding="UTF-8"?>
<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>
<!--    配置SpringBoot的父级项目-->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.3.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.lby</groupId>
    <artifactId>multi-module-demo</artifactId>
    <version>1.0-SNAPSHOT</version>
    <!--  packaging 父级项目的类型是pom  -->
    <packaging>pom</packaging>

    <!--   properties 定义pom的全局变量 一般用于定义依赖的版本号
 -->
    <properties>
        <java.version>1.8</java.version>
        <!--        lombok-version 这个标签是自定义的可以随便写
                本质上就是一个变量
        -->
        <lombok-version>1.18.4</lombok-version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <!--            版本号通过$获取properties中定义的版本号-->
            <version>${lombok-version}</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>

    <!--    dependencyManagement
        在 dependencyManagement 中配置的依赖 只是一种声明 声明了版本号
        不会被项目继承下来【相关的jar包不会被子项目下载到项目中】

        子项目如果想要继承到dependencyManagement中的依赖  需要单独在配置
        只不过子项目如果继承 dependencyManagement 中的依赖 可以不写版本号【子项目中依赖版本
        按照父项目中dependencyManagement 中配置下载】
    -->
    <dependencyManagement>
        <dependencies>
            <!--如果是Mybatis写成Mybatis即可-->
            <dependency>
                <groupId>com.baomidou</groupId>
                <artifactId>mybatis-plus-boot-starter</artifactId>
                <version>3.3.1.tmp</version>
            </dependency>

            <!--数据源-->
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>druid</artifactId>
                <version>1.0.19</version>
            </dependency>

            <!--mysql-->
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>5.1.38</version>
            </dependency>

        </dependencies>
    </dependencyManagement>

</project>

Уведомление:

  • Упаковка родительского проекта должна быть установлена ​​на pom
  • Разница между зависимостями и DependencyManagement
    • зависимости Внедрить зависимости в текущий проект. Если подпроект наследует проект, он также введет зависимости в подпроект
    • DependencyManagement только объявляет зависимости и фактически не вводит их, поэтому подпроекты должны явно объявлять зависимости, которые им нужно использовать.
      • Если зависимость объявлена ​​в подпроекте, она не будет унаследована от родительского проекта, только если зависимость прописана в подпроекте и конкретная версия не выполняется, она будет унаследована от родительского проекта, и версия и область действия будут унаследованы от родительского проекта.обе читаются из родительского pom
      • Если в подпроекте указан номер версии, будет использоваться версия jar, указанная в подпроекте.

Разработка подпроекта

Этапы разработки подпроекта следующие:

  1. Создать модуль на основе проекта
  2. изменить пом
  3. Напишите конфигурацию, если нет необходимости писать
  4. написать код

1. Создайте мультиобъект

1. Создать модуль на основе проекта

После создания мультиобъекта откройте pom, и вы увидите

На этом этапе откройте pom родительского проекта, и вы увидите

2. Измените помпу

POM полного многоцелевого проекта выглядит следующим образом:

<?xml version="1.0" encoding="UTF-8"?>
<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">
    <!--
       子项目继承父项目的配置 parent
    -->
    <parent>
        <artifactId>multi-module-demo</artifactId>
        <groupId>com.lby</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>

    <modelVersion>4.0.0</modelVersion>

    <artifactId>multi-entity</artifactId>

    <dependencies>
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
        </dependency>
    </dependencies>

</project>

3. Напишите классы сущностей в проекте

package com.lby.entity;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;

@TableName("cmfz_admin")
@Data
public class Admin {
    /**
     * 主键属性  @TableId
     *
     * value 该属性对应的数据库表中的字段名
     * type 主键自增的类型 AUTO 代表自动递增
     */
    @TableId(value = "id",type = IdType.AUTO)
    private Integer id;
    /**
     * 非主键属性  @TableField
     *  @TableField("username")  参数为该属性对应的数据库表中的字段名
     *
     */
    private String username;

    private String password;

    private String salt;

}

2. Выполните шаги, описанные выше, чтобы создать мультидао.

Для модуля dao разница в том, что класс сущностей в multi-entity нужно использовать в multi-dao, но как использовать класс сущностей в другом проекте в модуле dao?

Импортировать несколько объектов в несколько дао, как зависимость

полный файл pom с несколькими дао

<?xml version="1.0" encoding="UTF-8"?>
<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">
    <parent>
        <artifactId>multi-module-demo</artifactId>
        <groupId>com.lby</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>multi-dao</artifactId>

    <dependencies>
<!--        在dao中引用entity
        可以在dao的代码中直接导入entity中的类和方法
    -->
        <dependency>
            <groupId>com.lby</groupId>
            <artifactId>multi-entity</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>

        <!--        如果配置依赖在父项目的 dependencyManagement 有-->
        <!--        可以不写版本号 版本号继承父项目中的-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
        </dependency>


    </dependencies>
</project>

Написать интерфейс dao в мульти-dao

package com.lby.dao;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.lby.entity.Admin;

public interface AdminDao extends BaseMapper<Admin> {
}

3. Создайте мультисервисный модуль

полный пом-файл

<?xml version="1.0" encoding="UTF-8"?>
<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">
    <parent>
        <artifactId>multi-module-demo</artifactId>
        <groupId>com.lby</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>multi-service</artifactId>

    <dependencies>
<!--        multi-service中需要引入 dao模块-->
        <dependency>
            <groupId>com.lby</groupId>
            <artifactId>multi-dao</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
    </dependencies>
</project>

написать бизнес-класс

package com.lby.service;

import com.lby.dao.AdminDao;
import com.lby.entity.Admin;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * 之所以能够直接使用@Service注解
 * 是因为 multi-service 模块 依赖了 multi-dao
 * multi-dao 依赖了 multi-entity
 * multi-entity 中的 MybatisPlus 依赖在项目中导入了Spring的jar包
 */
@Service
public class AdminService {
    @Autowired
    private AdminDao adminDao;

    public List<Admin> adminList(){
        return adminDao.selectList(null);
    }

}

4. Создайте мультиконтроллерный модуль

Модуль с несколькими контроллерами — это модуль, в котором находится класс запуска.
Итак, мы поместили файл конфигурации, класс запуска и встроенный в SpringBoot плагин maven в этот проект.

1. Полный файл pom

<?xml version="1.0" encoding="UTF-8"?>
<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">
    <parent>
        <artifactId>multi-module-demo</artifactId>
        <groupId>com.lby</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>multi-controller</artifactId>

    <dependencies>
<!--        controller中需要引入service-->
        <dependency>
            <groupId>com.lby</groupId>
            <artifactId>multi-service</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>

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

        <!--测试-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <!--            spring-boot-maven-plugin 插件配置在启动类所在的模块-->
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

2. конфигурация файла конфигурации приложения

#配置端口号
server:
  port: 8802
#数据源的配置
spring:
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://localhost:3306/cmfz?useUnicode=true&characterEncoding=UTF-8
    username: root
    password: 123456
    type: com.alibaba.druid.pool.DruidDataSource

#mybatis-plus
mybatis-plus:
  mapper-locations: classpath:mapper/*Mapper.xml

# root 全局日志等级 默认是info 可以修改 debug warn error
logging:
  level:
    root: info
    com.baizhi: debug

3. Код стартового класса

package com.lby;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@MapperScan("com.lby.dao")
@SpringBootApplication
public class AppRun {

    public static void main(String[] args) {
        SpringApplication.run(AppRun.class,args);
    }
}

4.код контроллера

package com.lby.controller;

import com.lby.entity.Admin;
import com.lby.service.AdminService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

@RestController
public class AdminController {
    @Autowired
    private AdminService adminService;

    @RequestMapping("adminList")
    public List<Admin> adminList(){
        return adminService.adminList();
    }
}

5. Запустите проект

Запустите проект, запустив класс

Адрес доступа: http://localhost:8802/adminList Вы можете увидеть следующие эффекты

Если вы хотите использовать плагин для запуска, вам нужно сначала очистить и установить родительский проект.

6. Тест

написать тестовый класс

Эффект запуска тестового метода следующий

7. Упаковка проекта

Примечание. В каком модуле каким модулем упакован класс запуска.

Упаковка проекта через maven

Найдите упакованный проект и запустите проект через java -jar

Адрес доступа: http://localhost:8802/adminList Вы можете увидеть следующие эффекты

Вопросы-Ответы

1. Проблема циклической зависимости

image.png
image.png

Подсказка сообщения об ошибке:

Error:java: Annotation processing is not supported for module cycles. Please ensure that all modules from cycle [qrcode-common,qrcode-manager-pojo] are excluded from annotation processing

Анализ причин: круговая мертвая петля зависимостей

Решение: изменить зависимости в модуле

2. IDEA, изменяющая pom, не вступает в силу.

При использовании IDEA для разработки нескольких проектов обнаружил такую ​​проблему: после изменения файла pom, как бы вы его не обновляли, это не вступит в силу

Решение: просто перезапустите IDEA

Суммировать

В этой статье указан адрес загрузки исходного кода: https://gitee.com/bingqilinpeishenme/multi-module-demo.

Поздравляем с завершением этой главы и аплодисменты вам! Если эта статья была вам полезна, пожалуйста, помогите поставить лайк, прокомментировать, переслать, это очень важно для автора, спасибо.

Давайте еще раз рассмотрим цели обучения в этой статье.

  • Овладейте многомодульной разработкой в ​​SpringBoot

Чтобы узнать больше об использовании SpringBoot, продолжайте обращать внимание на эту серию руководств.

Просить внимания, просить лайки, просить переадресацию

Добро пожаловать в мою официальную учетную запись: Java Notes г-на Лу, которая будет обновлять графические руководства по технологии Java и видеоуроки, опыт изучения Java, опыт собеседований по Java и опыт практической разработки Java в долгосрочной перспективе.