博客 / 詳情

返回

COLA架構初始化DDD項目

  • 使用COLA腳手架初始化項目
  • 實戰代碼:https://gitee.com/XuXiaoCong/cola-springboot-demo
  • COLA項目地址:https://github.com/alibaba/COLA
  • BiliBili視頻

創建項目

  • 使用COLA腳手架(Maven)創建COLA項目

    • DgroupId: 公司/組織名稱
    • DartifactId:項目名稱
    • Dversion:版本號
    • Dpackage:包路徑
    # 先確認maven正確安裝
    mvn --version
    
    # Shell(Linux)
    mvn archetype:generate \
      -DgroupId=com.xxc \
      -DartifactId=cola-springboot-demo \
      -Dversion=0.0.1 \
      -Dpackage=com.xxc.demo \
      -DarchetypeArtifactId=cola-framework-archetype-web \
      -DarchetypeGroupId=com.alibaba.cola \
      -DarchetypeVersion=5.0.0
    
    # CMD(Windows)使用"^"當做換行符
    mvn archetype:generate ^
      -DgroupId=com.xxc ^
      -DartifactId=cola-springboot-demo ^
      -Dversion=0.0.1 ^
      -Dpackage=com.xxc.demo ^
      -DarchetypeArtifactId=cola-framework-archetype-web ^
      -DarchetypeGroupId=com.alibaba.cola ^
      -DarchetypeVersion=5.0.0
    
    # PowerShell(Windows)使用"`"當做換行符,並且參數使用單引號包裹
    mvn archetype:generate `
      -DgroupId='com.xxc' `
      -DartifactId='cola-springboot-demo' `
      -Dversion='0.0.1' `
      -Dpackage='com.xxc.demo' `
      -DarchetypeArtifactId='cola-framework-archetype-web' `
      -DarchetypeGroupId='com.alibaba.cola' `
      -DarchetypeVersion='5.0.0'
    

    清理生成代碼

  • 清理pom.xml文件(所有模塊)

    • 更新Java、SpringBoot依賴的版本

      • java:17
      • SpringBoot: 3.3.0/3.1.12
    • 除了SpringBoot、Cola有關的依賴,其他全部刪除

      • 生成代碼的依賴版本過於老舊,為了方便先全部刪除,後面再自行添加需要的組件
  • 清理代碼

    • 刪除所有實例代碼、單元測試,只保留基礎目錄
    • java使用"package-info.java"佔位
    • 目錄使用".gitkeep"文件佔位
    cola-springboot-demo
    ├─ .gitignore
    ├─ cola-springboot-demo-adapter
    │    ├─ pom.xml
    │    └─ src
    │         └─ main
    │              └─ java
    │                   └─ com
    │                        └─ xxc
    │                             └─ demo
    │                                  └─ package-info.java
    ├─ cola-springboot-demo-app
    │    ├─ pom.xml
    │    └─ src
    │         └─ main
    │              └─ java
    │                   └─ com
    │                        └─ xxc
    │                             └─ demo
    │                                  └─ package-info.java
    ├─ cola-springboot-demo-client
    │    ├─ pom.xml
    │    └─ src
    │         └─ main
    │              └─ java
    │                   └─ com
    │                        └─ xxc
    │                             └─ demo
    │                                  └─ package-info.java
    ├─ cola-springboot-demo-domain
    │    ├─ pom.xml
    │    └─ src
    │         └─ main
    │              └─ java
    │                   └─ com
    │                        └─ xxc
    │                             └─ demo
    │                                  └─ domain
    │                                       └─ package-info.java
    ├─ cola-springboot-demo-infrastructure
    │    ├─ pom.xml
    │    └─ src
    │         └─ main
    │              ├─ java
    │              │    └─ com
    │              │         └─ xxc
    │              │              └─ demo
    │              │                   ├─ config
    │              │                   │    └─ package-info.java
    │              │                   └─ package-info.java
    │              └─ resources
    │                   ├─ logback-spring.xml
    │                   └─ mybatis
    │                        └─ .gitkeep
    ├─ pom.xml
    └─ start
       ├─ pom.xml
       └─ src
            └─ main
                 ├─ java
                 │    └─ com
                 │         └─ xxc
                 │              └─ demo
                 │                   └─ Application.java
                 └─ resources
                      ├─ application.properties
                      └─ logback-spring.xml
  • 驗證是否有遺漏

    • 注意"ERROR"級別的錯誤,可能是沒刪完整,刪除對應文件即可
    mvn clean install

    Maven依賴

版本管理

  • 在根目錄的pom.xml中,使用"dependencyManagement"節點進行版本管理
  • 在使用的模塊才真正引入依賴

    Mybatis-plus

  • 數據庫操作

      <properties>
          <mybatis-plus-starter.version>3.5.6</mybatis-plus-starter.version>
          <mysql-connector.version>8.3.0</mysql-connector.version>
      </properties>
    
      <dependencyManagement>
          <dependencies>
              <dependency>
                  <groupId>com.baomidou</groupId>
                  <artifactId>mybatis-plus-boot-starter</artifactId>
                  <version>${mybatis-plus-starter.version}</version>
              </dependency>
              <dependency>
                  <groupId>com.mysql</groupId>
                  <artifactId>mysql-connector-j</artifactId>
                  <version>${mysql-connector.version}</version>
                  <scope>runtime</scope>
              </dependency>
          </dependencies>
      </dependencyManagement>
  • 在SpringBoot3.2/3.3使用mybatis報錯

    • 報錯信息:"Invalid value type for attribute 'factoryBeanObjectType': java.lang.String"
    • 解決方法:https://developer.aliyun.com/article/1395691
  • 如果怕麻煩,SpringBoot版本改為3.1.X

          <dependency>
              <groupId>com.baomidou</groupId>
              <artifactId>mybatis-plus-boot-starter</artifactId>
              <!--  排除mybatis  -->
              <exclusions>
                  <exclusion>
                      <artifactId>mybatis-spring</artifactId>
                      <groupId>org.mybatis</groupId>
                  </exclusion>
              </exclusions>
          </dependency>
          <!--  自定義mybatis版本  -->
          <dependency>
              <groupId>org.mybatis</groupId>
              <artifactId>mybatis-spring</artifactId>
              <version>3.0.3</version>
          </dependency>

    MapStruct

  • 用於對象的映射,主要在infrastructure的convertor使用
  • 由於MapStruct的特殊性,需要修改plugin

      <properties>
          <mapstruct.version>1.5.5.Final</mapstruct.version>
          <mapstruct.binding>0.2.0</mapstruct.binding>
          <projectlombok.version>1.18.32</projectlombok.version>
      </properties>
    
      <dependencyManagement>
          <dependencies>
            
              <dependency>
                  <groupId>org.mapstruct</groupId>
                  <artifactId>mapstruct</artifactId>
                  <version>${mapstruct.version}</version>
              </dependency>
            
          </dependencies>
      </dependencyManagement>
    
      <build>
          <pluginManagement>
              <plugins>
                
                  <plugin>
                      <artifactId>maven-compiler-plugin</artifactId>
                      <version>3.10.1</version>
                      <configuration>
                          <!-- MapStruct依賴 -->
                          <annotationProcessorPaths>
                              <path>
                                  <groupId>org.mapstruct</groupId>
                                  <artifactId>mapstruct-processor</artifactId>
                                  <version>${mapstruct.version}</version>
                              </path>
                              <path>
                                  <groupId>org.projectlombok</groupId>
                                  <artifactId>lombok</artifactId>
                                  <version>${projectlombok.version}</version>
                              </path>
                              <path>
                                  <groupId>org.projectlombok</groupId>
                                  <artifactId>lombok-mapstruct-binding</artifactId>
                                  <version>${mapstruct.binding}</version>
                              </path>
                          </annotationProcessorPaths>
                      </configuration>
                  </plugin>
    
              </plugins>
          </pluginManagement>
      </build>
    

    Swagger

  • 使用Swagger顯示文檔
  • spring-boot-starter-validation是Spring

      <properties>
          <springdoc.version>2.5.0</springdoc.version>
      </properties>
    
      <dependencyManagement>
          <dependencies>
            
              <dependency>
                  <groupId>org.springdoc</groupId>
                  <artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>
                  <version>${springdoc.version}</version>
              </dependency>
            
          </dependencies>
      </dependencyManagement>

    打包配置

  • start層,pom.xml增加打包插件

      <build>
          <finalName>${project.artifactId}</finalName>
          <plugins>
              <plugin>
                  <groupId>org.springframework.boot</groupId>
                  <artifactId>spring-boot-maven-plugin</artifactId>
                  <executions>
                      <execution>
                          <id>repackage</id>
                          <goals>
                              <goal>repackage</goal>
                          </goals>
                      </execution>
                  </executions>
              </plugin>
          </plugins>
      </build>
  • 配置後可打包jar文件,使用java命令運行
# 打包jar文件
mvn clean package

# 運行jar文件
java -jar start/target/start.jar

填充代碼

  • 代碼下載地址:https://gitee.com/XuXiaoCong/cola-springboot-demo
  • 代碼中,大部分先使用領域分包,再使用功能分包

    • 領域分包指,用户(User)、訂單(Order)、Product(商品)等大方向區分
    • 功能分包指,如下結構圖中的"executor","consumer","scheduler"等功能
    • 不使用領域分包的例外

      • Adapter層:控制器包含多個接口,本身按領域區分了
      • Infrastructure層中的"config":因為是全局設置,無法按領域劃分

參考文章

  • Spring Boot 升級 3.2 報錯 Invalid value type for attribute ‘factoryBeanObjectType‘: java.lang.String
user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.