添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
睿智的酸菜鱼  ·  海通证券·  1 月前    · 
痴情的红薯  ·  GitHub - ...·  6 月前    · 
独立的松鼠  ·  ERROR [HY000] ...·  6 月前    · 

背景

项目中为了整体代码的高内聚与可移植性, 按照maven-module的方式对代码进行了拆分, 样例如下:

- root-module
  - shared-common-module
  - middleware-module
    - cache-module
      - cache-api
      - cache-local-impl
      - cache-redis-impl
    - persistence-module
      - persistence-api
      - persistence-mysql
      - persistence-oracle
  - biz-module
    - controller-module
    - service-module

基本规范

root-module pom文件有两个作用:

  1. 作为parent module, 管理各个子模块, 便于resolve自身各个模块之间的依赖关系. 如下, biz_module依赖(GAV)middleware-module + shared-common-module; middleware-module依赖(GAV)shared-common-module:
  2. <modules>
        <module>shared-common-module</module>
        <module>middleware-module</module>
        <module>biz-module</module>
    </modules>
  3. 作为parent pom, 统一管理各个子模块的Maven依赖, 同时默认引入通用的maven依赖(例如apache-commons, guava等), 而无需子模块重复引入.
  4. <dependencyManagement>
        <dependencies>
        </dependencies>
    </dependencyManagement>
    <dependencies>
    </dependencies>

    子模块之间依赖关系

    依赖关系如下:

    controller-module --> service-module --> cache-api                              --> shared-common
                                         --> cache-redis-impl/cache-local-impl      --> shared-common
                                         --> persistence-api                        --> shared-common
                                         --> persistence-mysql                      --> shared-common

    问题说明

    上述多模块导致的问题, 在SpringBoot场景下, 由于默认的Application是放在最外层的controller-module.
    根据依赖关系, middleware-module, shared-common-module等无法依赖controller-module(否则会导致循环依赖)
    所以由于找不到Application入口, 无法by模块地启动spring容器, 进行集成测试.

  5. 每个模块能做到高内聚, 即模块相关的配置项都放在模块内部. 例如
    1. persistence-mysql相关的datasource的配置, 放在persistence-mysql模块的resources/xxx.properties里
    2. cache-redis-impl相关的redis配置, 放在cache-redis-impl模块的resources/xxx.properties里
    3. 各个模块的测试态/运行态配置项是自说明的, 能便于依赖方进行集成测试, 而无需依赖方再重新配置一份. 例如:
      1. service-module依赖了 persistence-mysql , cache-redis-impl 两个模块, service-module需要在UT里启动Spring容器, 测试具体service方法.
      2. 无需把 persistence-mysql里的测试datasource配置, cache-redis-impl里的测试redis配置都在自己的 application.properties 里写一份.
      3. 可以直接引入对应模块提供的测试properties.
      4. 如果可以实现, 尤其是在模块依赖层次很深很复杂的时候, 使用简便性会更好. 例如 controller-module 层测试, 只需要配置controller层自己的配置就好, 无需关心到底依赖到的是哪些module, 这些module里到底需要哪些配置项.
      5. 能够by模块/分层地启动Spring容器进行测试
        1. 方案1: JMockit