核心(Core)
YMP 框架主要是由核心(Core)和模块(Module)组成,核心也称之为应用容器(IApplication),主要负责框架初始化、事件(Events)广播与监听、模块的定义及其生命周期管理、国际化资源管理(I18N)和类对象管理等,其核心功能是对包和类的自动扫描(AutoScan)、对象的生命周期管理、以及反转控制(IoC)、依赖注入(DI)和方法拦截(AOP)等。
Maven包依赖
<dependency>
<groupId>net.ymate.platform</groupId>
<artifactId>ymate-platform-core</artifactId>
<version>2.1.4</version>
</dependency>
框架初始化
YMP 框架的初始化方式有两种,一种是配置文件方式,另一种则是基于注解。我们更推荐两者配合使用,当两者共存时,配置文件方式更优先于注解方式(即,当注解和配置文件中对相同配置项赋值时,则优先使用配置文件中的非空值)。
基于配置文件初始化
YMP 框架默认使用名称为 ymp-conf.properties 的配置文件 ,默认该文件放置在 classpath 的根路径下,也可以通过 JVM 启动参数 -Dymp.configFile 指定具体配置文件路径。
框架从 2.1.4 版本开始同时支持 properties 和 YAML(.yaml 或 .yml)两种配置文件格式,YAML 格式的解析依赖 SnakeYAML 类库,该类库为可选依赖,请根据需要自行引入,若当前工程中不存在此类库,则跳过 YAML 配置文件的加载,原有 properties 配置逻辑不受影响。
具体加载流程如下:
- 首先,检查JVM启动参数
-Dymp.configFile,若指定了具体配置文件路径(支持properties、yaml和yml格式,要求绝对路径),则仅加载该配置文件,不再执行后续查找。 - 若未指定或指定的配置文件加载失败,则按以下顺序分层查找并加载配置文件,每个层级内均按
properties→yaml→yml的顺序优先加载第一个找到的文件,后加载层级的配置项将覆盖先加载层级的同名配置项:- 全量基础配置文件:
ymp-conf.properties/ymp-conf.yaml/ymp-conf.yml,作为基础配置永远优先加载; - 操作系统特定配置文件(可选):
ymp-conf_WIN.*或ymp-conf_UNIX.*,仅覆盖需要针对操作系统调整的配置项; - 运行环境特定配置文件(可选):根据JVM启动参数
-Dymp.env判断当前运行环境(默认值:dev):-Dymp.env=dev:开发环境,加载ymp-conf_DEV.*-Dymp.env=test:测试环境,加载ymp-conf_TEST.*-Dymp.env=product:生产环境,加载ymp-conf_PRODUCT.*
- 全量基础配置文件:
也就是说,环境特定与操作系统特定的配置文件不再要求是全量配置,仅书写需要覆盖的配置项即可,其余配置项将由全量基础配置文件提供。
YAML 是层级嵌套结构,框架加载时会将其扁平化为点号分隔的键值对,以适配框架内部的配置分析器,规则如下:
- 嵌套映射将递归展开为点号分隔的键名,如:
ymp.configs.jdbc.connection_url; - 集合元素以竖线(
|)连接为字符串,与properties文件中数组的书写约定保持一致; - 示例:
ymp:
dev_mode: true
excluded_packages:
- com.test
- com.demo
configs:
jdbc:
connection_url: jdbc:mysql://localhost/db
以上内容等同于 properties 文件中的:
ymp.dev_mode=true
ymp.excluded_packages=com.test|com.demo
ymp.configs.jdbc.connection_url=jdbc:mysql://localhost/db
示例代码:
public class Starter {
private static final Log LOG = LogFactory.getLog(Starter.class);
public static void main(String[] args) throws Exception {
try (IApplication application = YMP.run(args)) {
if (application.isInitialized()) {
LOG.info("Everything depends on ability! -- YMP :)");
}
}
}
}
上述代码中通过 YMP.run() 方法构建了一个 IApplication 接口实例对象,而这个 IApplication 对象就是框架应用容器。
基于注解初始化
YMP 框架从 2.1.0 版本开始支持通过注解针对各个模块进行初始化配置,项目中允许包括多个基于注解的配置类,并支持通过 JVM 启动参数 -Dymp.mainClass 任意切换使其生效,方便根据自身业务特点灵活调配。
示例代码:
@EnableAutoScan
@EnableBeanProxy
@EnableDevMode
@DefaultPasswordProcessClass
@EventsConf(mode = Events.MODE.NORMAL, threadPoolSize = 200)
@I18nConf(defaultLocale = "zh_CN")
@LogConf(allowConsoleOutput = true, configFile = "${user.dir}/cfgs/log4j.xml")
@ConfigurationConf(configHome = "${user.dir}/configs", checkTimeInterval = 300000)
public class Starter {
static {
System.setProperty(IApplication.SYSTEM_MAIN_CLASS, Starter.class.getName());
}
private static final Log LOG = LogFactory.getLog(Starter.class);
public static void main(String[] args) throws Exception {
try (IApplication application = YMP.run(args)) {
if (application.isInitialized()) {
LOG.info("Everything depends on ability! -- YMP :)");
}
}
}
}
应用容器扩展初始化处理器接口(IApplicationInitializer)
为了让开发者可以对应用容器有更多的可定制、扩展能力,框架提供了应用容器扩展初始化处理器(IApplicationInitializer) 接口,其通过SPI方式在框架启动时自动扫描类和包路径下 META-INF/services/或 META-INF/services/internal/ 目录中所有名称为 net.ymate.platform.core.IApplicationInitializer 的文件并加载文件中指定的所有接口实现类。
该接口可以帮助你完成如下操作:
| 方法名称 | 描述 |
|---|---|
| afterEventInit | 当事件管理器初始化完毕后将调用此方法 |
| beforeBeanLoad | 当对象加载器开始执行加载动作前将调用此方法 |
| beforeModuleManagerInit | 当模块管理器执行初始化动作前将调用此方法 |
| beforeBeanFactoryInit | 当对象工厂执行初始化动作前将调用此方法 |
自定义Banner
以 Maven 工程为例,在 src/main/resources 路径下新建名称为 banner.txt 的文本文件,该文件编译后将被放置在 classes 目录下,框架在启动时会优先加载该文件内容,若文件不存在或文件内容为空时,将默认输出如下内容:
__ __ __ ___ ___
\ \/ // |/ // _ \
\ // /|_/ // ___/
/_//_/ /_//_/ www.ymate.net