使用Mybatis过程中,很多时候修改了XML文件需要整个项目重新启动,比较耗时,如果没什么业务数据状态还好,有数据状态可就惨啦,所以XML自动线下更新就很有必要。手写一个简单实现,大家参考下。
我的实现思路就是利用一个额外线程扫描mybatis
XML文件,更新到 Spring
中的 上下文ApplicationContext
中。
1. 配置文件
我们定义一套刷新时间和周期频次的配置文件在路径 persistence-mybatis\mybatis-base\src\main\resources\conf\mybatis-refresh.properties
中,里面内容如下:
1 | enabled=true |
- enabled:是否开启自动刷新
- delaySeconds: 间隔时间
- sleepSeconds: 休眠时间
- mappingPath:XML的路径
核心类需要实现上下文接口 ApplicationContextAware
。
2. 关键步骤
- @Override重写
setApplicationContext
方法 - 用静态语句块,初始化配置文件中的相关参数
- @PostConstruct:在构造函数之后对
SqlSessionFactory
进行额外配置 - 启用线程按照频次间隔重复执行上述操作
关键性步骤如下:
1 | // 1、从上下文容器获取 SqlSessionFactory |
核心类在akkad-base\persistence-mybatis\mybatis-base\src\main\java\xyz\wongs\drunkard\base\persistence\mybatis\loader\MapperAutoRefresh.java
下,而且行数太长,代码就不贴。
在多线程处理这块有需要注意有一定的线程使用基础,看官自行学习。