Mybatis自动刷新XML

使用Mybatis过程中,很多时候修改了XML文件需要整个项目重新启动,比较耗时,如果没什么业务数据状态还好,有数据状态可就惨啦,所以XML自动线下更新就很有必要。手写一个简单实现,大家参考下。

我的实现思路就是利用一个额外线程扫描mybatis XML文件,更新到 Spring中的 上下文ApplicationContext中。

Mybatis自动刷新XML_第1张图片
mybatis

1. 配置文件

我们定义一套刷新时间和周期频次的配置文件在路径 persistence-mybatis\mybatis-base\src\main\resources\conf\mybatis-refresh.properties 中,里面内容如下:

enabled=true
delaySeconds=30
sleepSeconds=10
mappingPath=mapper
  • enabled:是否开启自动刷新
  • delaySeconds: 间隔时间
  • sleepSeconds: 休眠时间
  • mappingPath:XML的路径

核心类需要实现上下文接口 ApplicationContextAware

2. 关键步骤

  • @Override重写setApplicationContext 方法
  • 用静态语句块,初始化配置文件中的相关参数
  • @PostConstruct:在构造函数之后对SqlSessionFactory进行额外配置
  • 启用线程按照频次间隔重复执行上述操作

关键性步骤如下:

// 1、从上下文容器获取 SqlSessionFactory
SqlSessionFactory sessionFactory = applicationContext.getBean(SqlSessionFactory.class);
// 2、获取Configuration
Configuration configuration = sessionFactory.getConfiguration();
this.configuration = configuration;
// 3、扫描Locations
mapperLocations = getResource(basePackage,XML_RESOURCE_PATTERN);
// 4、启动线程执行
exeTask();

核心类在akkad-base\persistence-mybatis\mybatis-base\src\main\java\xyz\wongs\drunkard\base\persistence\mybatis\loader\MapperAutoRefresh.java 下,而且行数太长,代码就不贴。

在多线程处理这块有需要注意有一定的线程使用基础,看官自行学习。

3. 源码地址,如果觉得对你有帮助,请Star

Mybatis自动刷新XML_第2张图片
觉得对你有帮助,请Star

Github源码地址

Gitee源码地址

你可能感兴趣的:(Mybatis自动刷新XML)