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 接口的實作類
2.在對應的 mapper.xml 中将原有注釋修改為連結式聲明,以保證 xml 檔案裡的緩存能夠正常@CacheNamespace(implementation=MybatisRedisCache.class,eviction=MybatisRedisCache.class) public interface DataResourceMapper extends BaseMapper<DataResource>{}
不推薦,但是還是用一下吧,畢竟之前做部落格項目用二級緩存效果不錯,結構直接報錯了: ##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層定制緩存業務類