一个 SOFABoot 工程可以包含多个模块,每个模块主要包括下述 2 个部分:
一个普通的 JAR 包。内容包括:
Java 代码
Spring 配置文件
SOFABoot 子模块标识
SOFABoot 特有的配置。这些特有的配置,让一个 JAR 包能够被 SOFABoot 识别,使之具备模块化的能力。主要包含下述 2 部分内容:
properties 配置文件。说明如下:
路径:位于可部署模块的 resources 目录下。可部署模块指使用 spring-boot-maven-plugin 打包的模块。
命名规则:采用固定名称
sofa-module.properties
。配置内容:主要配置 SOFABoot 模块的名称以及模块之间的依赖关系。
Spring 配置文件。说明如下:
路径:位于 SOFABoot 模块的
META-INF/spring
目录下。新建工程默认无 spring 文件夹,需用户创建。数量:可以配置任意多的 Spring XML 配置文件。SOFABoot 会自动把它们作为本模块的 Spring 配置加载起来。
sofa-module.properties 文件详解
sofa-module.properties
的配置内容,示例如下:
Module-Name=com.alipay.test.biz.service.impl
Spring-Parent=com.alipay.test.common.dal
Require-Module=com.alipay.test.biz.shared
Module-Profile=dev
对配置文件中待配置属性对应的键,说明如下:
Module-Name
Module-Name
是 SOFABoot 模块的名称,也是 SOFABoot 模块的唯一标识符。值的唯一性要满足下述条件:
在一个 SOFABoot 工程中,不同模块的
Module-Name
不得重复。如果依赖了其它工程的 SOFABoot 模块,则也不能和所依赖工程中的模块同名。
Spring-Parent
各个模块都有一个 Spring 上下文,且彼此隔离。
Spring-Parent
主要用来打通 2 个你期望打通的模块的 Spring 上下文。由于 Spring 的限制,一个模块的 Spring-Parent 只能有一个模块。故而在 SOFABoot 中,当一个模块 A 的 Spring-Parent 设置为另外一个模块 B,则 A 的 Spring-Parent 不再是根上下文 Root ApplicationContext , 但是最终还是间接依赖到了根上下文,也能间接访问根上下文中的 Bean。
关于 Spring-Parent 的作用,可参考 Spring 的 BeanFactory 说明(英文)。
Require-Module
Require-Module
用于定义模块之间的依赖顺序,值是以逗号分隔的 SOFABoot 模块名列表。属性值对应的模块会先于属性键对应的模块。
一般情况下,是不需要为模块配置该属性值,只有当 Spring 上下文有依赖关系时,才配置该键。
配置示例:
Require-Module=com.alipay.test.biz.shared
表示下述含义:本模块依赖于
com.alipay.test.biz.shared
模块。com.alipay.test.biz.shared
模块将先于本模块启动 Spring 上下文。
应用示例:您在 A 模块中发布了一个 SOFA JVM Service。在 B 模块的某一个 Bean 的
init
方法里面,需要使用 SOFA Reference 调用这个 SOFA JVM Service。假设 B 模块在 A 模块之前启动了,那么 B 模块的 Bean 就会因为 A 模块的 JVM Service 没有发布而 init 失败,从而导致 Spring 上下文启动失败。
此时可以使用
Require-Module
来强制 A 模块在 B 模块之前启动。
Module-Profile:支持 SOFABoot Profile 能力,详情参见 模块激活配置。