天天看点

SpringBoot多模块项目ApplicationContext无法getBean,MybatisPlus二级缓存与放弃Mybatis(Plus)的二级缓存SpringBoot多模块项目ApplicationContext无法getBean,MybatisPlus二级缓存与放弃Mybatis(Plus)的二级缓存

SpringBoot多模块项目ApplicationContext无法getBean,MybatisPlus二级缓存与放弃Mybatis(Plus)的二级缓存

事情是这样发生的

我想用redis实现mybatis-plus的二级缓存,用mybatis的方法(准备好cahce类,在mapper文件里面标记上cahce标签)发现不起作用!!!气愤,查了一下,下面是文档原文:

mapper 层二级缓存问题

我们建议缓存放到 service 层,你可以自定义自己的 BaseServiceImpl 重写注解父类方法,继承自己的实现。

#mapper 层二级缓存刷新问题

如果你按照 mybatis 的方式配置第三方二级缓存,并且使用 2.0.9 以上的版本,则会发现自带的方法无法更新缓存内容,那么请按如下方式解决(二选一):

1.在代码中 mybatis 的 mapper 层添加缓存注释,声明 implementation 或 eviction 的值为 cache 接口的实现类

@CacheNamespace(implementation=MybatisRedisCache.class,eviction=MybatisRedisCache.class)
public interface DataResourceMapper extends BaseMapper<DataResource>{}
           
2.在对应的 mapper.xml 中将原有注释修改为链接式声明,以保证 xml 文件里的缓存能够正常

不推荐,但是还是用一下吧,毕竟之前做博客项目用二级缓存效果不错,结构直接报错了: ##Error querying database. Cause: java.lang.NullPointerException

先说一下是怎么出现错误的

public class RedisCache implements Cache {

    ·········

    public RedisTemplate getRedisTemplate() {
        RedisTemplate redisTemplate = (RedisTemplate) ApplicationContextUtils.getBean("redisTemplate");
        return redisTemplate;
    }

}
           
@Configuration
public class RedisConfig {
    
    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
        ········
        return template;
    }
}
           

用过mybatis二级缓存的都知道,需要用ApplicationContext手动注入RedisTemplate,报错的原因就是注入不进去,为啥注入不进去,之前的项目明明可以啊!

我的推断是因为现在多模块了,SpringBoot要加载bean是先加载子项目的jar然后再加载,bean加载顺序出现了问题!(当然只是我的臆想,顺便学一下如果你还不知道如何控制springboot中bean的加载顺序,那你一定要看此篇)

有一说一文章写的非常好!但是我也没有试,在自己瞎鼓捣了一天之后,看了一些多模块的开源项目,发现没有使用mybatis二级缓存的!!!想参考都没有!于是我百度搜——》“mybaits二级缓存开启好还是不开好”,结果喜人!

放弃mybatis二级缓存

mybatis 学习五 二级缓存不推荐使用

mybatis二级缓存对多表查询不支持,还要过滤,而且严重依赖application,这也导致了我上面遇到的bug,那太棒了我也省事了,不是有新活了。

在Service层使用缓存

编写RedisService业务类,单独定制,这也就用redis相对少多了,以前是只有是高频表就放到redis里面,现在只在最高频的地方定制redis缓存。

总结

1、放弃Mybatis二级缓存

2、在Service层定制缓存业务类