天天看點

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層定制緩存業務類