SpringBoot - 多模組專案的搭建教程

劉長大發表於2020-12-02

在IDEA中搭建SpringBoot多模組專案的過程。
框架選定為SpringBoot+Mybatis
1、建立父工程
在這裡插入圖片描述
點選下一步
在這裡插入圖片描述
填寫專案名稱後 —選擇java Version-------點選下一步
在這裡插入圖片描述
不要選擇任何—點選下一步
在這裡插入圖片描述
選擇專案存放位置 -----點選完成
在這裡插入圖片描述
刪除剛建立工程裡不需要的檔案, 只保留:.idea 資料夾 、專案 pom 檔案、以及一個 *.iml 檔案。
在這裡插入圖片描述
2.建立子工程
(1)右鍵點選父工程,選擇 New -> Module… 建立子模組。這裡依次建立 broker-base、broker-dao、broker-service 和 broker-web 共 4 個模組。

注意:除了 broker-web 子模組建立時選擇新增 Spring Web 依賴
(當然也可以建立時不新增,等後面再手動編輯 pom.xml 檔案新增),其他模組暫時不新增依賴。

在這裡插入圖片描述
點選下一步
在這裡插入圖片描述

填寫專案名稱點選下一步
在這裡插入圖片描述
點選下一步
在這裡插入圖片描述
點選完成
在這裡插入圖片描述
在這裡插入圖片描述

broker-dao、broker-service 建立方法相同
broker-web

注意:除了 broker-web 子模組建立時選擇新增 Spring Web 依賴
(當然也可以建立時不新增,等後面再手動編輯 pom.xml 檔案新增),其他模組暫時不新增依賴。

在這裡插入圖片描述
在這裡插入圖片描述
(2)將 4 個子模組的 mvnw、mvnw.cmd 檔案及 .mvn 資料夾全部刪除。
在這裡插入圖片描述
(3)對於 src 裡的內容,只保留 hangge-web 的啟動類和配置檔案,其他子模組的的啟動類和配置檔案都刪除:
在這裡插入圖片描述
3,編輯父工程 pom.xml 檔案
將父工程 pom.xml 檔案修改成如下內容,裡面宣告該父工程包含的子模組,同時抽取統一的配置資訊和依賴版本控制,這樣可以方便子 pom 直接引用,簡化子 pom 的配置。
多模組專案中,父模組打包型別必須是 pom。
因為開發框架是 spring boot,父模組預設繼承 spring-boot-starter-parent,因此可以刪除 spring-boot-starter 和 spring-boot-starter-test 依賴(祖先已經包含了)

<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <packaging>pom</packaging>
    <modules>
        <module>broker-base</module>
        <module>broker-dao</module>
        <module>broker-service</module>
        <module>broker-web</module>
    </modules>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.4.0</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>broker</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>broker</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <!-- 版本說明:這裡統一管理依賴的版本號 -->
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>com.example</groupId>
                <artifactId>broker-base</artifactId>
                <version>0.0.1-SNAPSHOT</version>
            </dependency>
            <dependency>
                <groupId>com.example</groupId>
                <artifactId>broker-dao</artifactId>
                <version>0.0.1-SNAPSHOT</version>
            </dependency>
            <dependency>
                <groupId>com.example</groupId>
                <artifactId>broker-service</artifactId>
                <version>0.0.1-SNAPSHOT</version>
            </dependency>
            <dependency>
                <groupId>com.example</groupId>
                <artifactId>broker-web</artifactId>
                <version>0.0.1-SNAPSHOT</version>
            </dependency>
        </dependencies>
    </dependencyManagement>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

4,編輯子模組 pom.xml 檔案
(1)子模組 broker-base 的 pom.xml 檔案內容如下,其中 parent 要使用頂層的父模組,同時由於我們專案用到了 Lombok ,所以還新增了 lombok 依賴:
注意:由於子模組的配置資訊會繼承父模組的,所以子模組原來的 properties 可刪掉。

<?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
         https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.example</groupId>
    <artifactId>broker-base</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>broker-base</name>
    <description>Demo project for Spring Boot</description>

    <!-- 繼承本專案的父工程 -->
    <parent>
        <groupId>com.example</groupId>
        <artifactId>broker</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>

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

(2)子模組 broker-dao 的 pom.xml 檔案內容如下,同樣 parent 要使用頂層的父模組,並新增 broker-base 子模組,以及資料庫相關依賴:

<?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
         https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.example</groupId>
    <artifactId>broker-dao</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>hangge-dao</name>
    <description>Demo project for Spring Boot</description>

    <!-- 繼承本專案的父工程 -->
    <parent>
        <groupId>com.example</groupId>
        <artifactId>broker</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>

    <dependencies>
        <!-- dao 子模組又依賴 base 子模組 -->
        <dependency>
            <groupId>com.example</groupId>
            <artifactId>broker-base</artifactId>
        </dependency>
        <!-- Spring Data JPA 依賴 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <!-- 資料庫驅動依賴 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <!-- 資料庫連線池 -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.1.9</version>
        </dependency>
    </dependencies>
</project>

 

(3)子模組 broker-service 的 pom.xml 檔案內容如下,同樣 parent 要使用頂層的父模組,並新增 broker-dao 子模組依賴:

<?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
          https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.example</groupId>
    <artifactId>broker-service</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>hangge-service</name>
    <description>Demo project for Spring Boot</description>

    <!-- 繼承本專案的父工程 -->
    <parent>
        <groupId>com.example</groupId>
        <artifactId>broker</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>

    <dependencies>
        <!-- service 子模組又依賴 dao 子模組 -->
        <dependency>
            <groupId>com.example</groupId>
            <artifactId>broker-dao</artifactId>
        </dependency>
    </dependencies>
</project>

(4)子模組 broker-web 的 pom.xml 檔案內容如下,同樣 parent 要使用頂層的父模組,並新增 broker-service 子模組依賴:

注意: 之前建立這個子模組的時候已經新增了 spring-boot-starter-web 依賴,如果沒有則手動新增。
<?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
         https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.example</groupId>
    <artifactId>broker-web</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>broker-web</name>
    <description>Demo project for Spring Boot</description>

    <!-- 繼承本專案的父工程 -->
    <parent>
        <groupId>com.example</groupId>
        <artifactId>broker</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>

    <dependencies>
        <!-- web 子模組又依賴 service 子模組 -->
        <dependency>
            <groupId>com.example</groupId>
            <artifactId>broker-service</artifactId>
        </dependency>

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

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

5,移動專案啟動類所在的包
(1)目前專案啟動類 BrokerWebApplication在com.example.brokerweb包下面,我們需要將其移動移動到 com.example 包下。

 如果不移動啟動類的話,在多模組專案中會可能會碰到一個模組無法通過 
 @Autowired 注入其他模組裡的物件的問題。啟動時會報類似如下的錯誤:
Field bookService in com.example.hanggeweb.controller.
HelloController required a bean of type 'com.example.brokerservice.BookService' that could not be found.

(2)移動的方式就是右鍵點選 BrokerWebApplication選擇 Refactor -> Move…
在這裡插入圖片描述
在這裡插入圖片描述
6,開始編碼
建立一個broker資料庫 並建立一個book表

/*
 Navicat Premium Data Transfer

 Source Server         : 本地MySQL
 Source Server Type    : MySQL
 Source Server Version : 50728
 Source Host           : localhost:3306
 Source Schema         : broker

 Target Server Type    : MySQL
 Target Server Version : 50728
 File Encoding         : 65001

 Date: 02/12/2020 11:31:23
*/

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for book
-- ----------------------------
DROP TABLE IF EXISTS `book`;
CREATE TABLE `book`  (
  `id` int(11) NOT NULL,
  `name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `author` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `price` float(10, 2) NULL DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of book
-- ----------------------------
INSERT INTO `book` VALUES (1, '1', '1', 1.00);

SET FOREIGN_KEY_CHECKS = 1;

(1)首先在broker-dao 模組中新增一個 Book 實體類:
在這裡插入圖片描述

package com.example.brokerdao;

import lombok.Getter;
import lombok.Setter;
import lombok.NoArgsConstructor;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Entity(name = "book")
@Setter
@Getter
@NoArgsConstructor
public class Book {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;
    private String name;
    private String author;
    private Float price;
}

(2)接著在 broker-dao 模組中新增 BookDao 介面,繼承 JpaRepository:

package com.example.brokerdao;

import org.springframework.data.jpa.repository.JpaRepository;

public interface BookDao extends JpaRepository<Book, Integer> {
}

(3)接著在 broker-service 模組中新增一個業務實現類 BookService,注入 BookDao 並呼叫:

package com.example.brokerservice;

import com.example.brokerdao.Book;
import com.example.brokerdao.BookDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class BookService {
    @Autowired
    BookDao bookDao;

    public List<Book> allBooks() {
        return bookDao.findAll();
    }
}

4)然後在 broker-web 模組中建立一個 Controller,注入 BookService 並呼叫:

package com.example.brokerweb;
import com.example.brokerdao.Book;
import com.example.brokerservice.BookService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@RestController
@RequestMapping("/broker")
public class HelloWoreldController {

    @Autowired
    BookService bookService;

    @GetMapping("test")
    public List<Book> test() {
        return bookService.allBooks();
    }
}

(5)最後在 broker-web 模組的 application.properties 中配置資料庫基本資訊以及 JPA 相關配置:

spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.url=jdbc:mysql://localhost:3306/broker?serverTimezone=Asia/Shanghai
spring.datasource.username=root
spring.datasource.password=123456
#是否在控制檯列印JPA執行過程生成的SQL
spring.jpa.show-sql=true 
#表示JPA對應的資料庫是MySQL
spring.jpa.database=mysql
#表示在專案啟動時根據實體類更新資料庫中的表
spring.jpa.hibernate.ddl-auto=update
#表示使用的資料庫方言是MySQL57Dialect
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL57Dialect

7,執行測試
(1)執行 broker-web 模組下的 Application 的啟動類:
在這裡插入圖片描述
(2)使用瀏覽器訪問http://localhost:8080/broker/test便可查詢到相關的資料資訊:
在這裡插入圖片描述

相關文章