第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會有你想問的

為什么添加超類會破壞我的 Spring bean?

為什么添加超類會破壞我的 Spring bean?

蕪湖不蕪 2021-10-27 16:48:23
我有一個(gè)運(yùn)行正常的 Spring Boot Web 應(yīng)用程序。我注意到兩個(gè)@Repositorybean 有很多共同點(diǎn),所以我使用抽象超類重構(gòu)了它們,現(xiàn)在我的應(yīng)用程序壞了。我已經(jīng)仔細(xì)檢查過,這是我在工作狀態(tài)和非工作狀態(tài)之間所做的唯一更改。誰能看到我做錯了什么?這是我的工作代碼:public class One { ... }public class Two { ... }@Repositorypublic class RepoOne {    private final ISource<One> sourceOne;    private ICache<One> cache;    @Value("${com.example.lifetime.one}")    private int lifetime;    public RepoOne(ISource<One> sourceOne) {       this.sourceOne = sourceOne;    }    @PostConstruct    public void createCache() {       Duration lifetime = Duration.ofMinutes(this.lifetime);       this.cache = new Cache<>(lifetime, sourceOne);    }    public One get(String key) {      return cache.get(key);    }}@Repositorypublic class RepoTwo {    private final ISource<Two> sourceTwo;    private ICache<Two> cache;    @Value("${com.example.lifetime.two}")    private int lifetime;    public RepoOne(ISource<Two> sourceTwo) {        this.sourceTwo = sourceTwo;    }    @PostConstruct    public void createCache() {        Duration lifetime = Duration.ofMinutes(this.lifetime);        this.cache = new Cache<>(lifetime, sourceTwo);    }    public Two get(String key) {        return cache.get(key);    }}@Servicepublic class RepoService {    private final RepoOne repoOne;    private final RepoTwo repoTwo;    public RepoService(RepoOne repoOne, RepoTwo repoTwo) {        this.repoOne = repoOne;        this.repoTwo = repoTwo;    }    public void doSomething(String key) {        One one = repoOne.get(key);        ...    }}這是我重構(gòu)的代碼,我在其中引入了一個(gè)抽象的通用超類。
查看完整描述

1 回答

?
收到一只叮咚

TA貢獻(xiàn)1821條經(jīng)驗(yàn) 獲得超5個(gè)贊

不是你引入了父類,而是你把get方法變成了final方法。

帶有注釋的類@Repository將獲得自動異常翻譯。這種自動異常轉(zhuǎn)換是通過使用 AOP 添加的。在 Spring 中應(yīng)用 AOP 的默認(rèn)機(jī)制是使用代理,在這種情況下是基于類的代理。

發(fā)生的事情是 CgLib 通過子類化為您的類創(chuàng)建代理,以便在調(diào)用方法時(shí)可以添加建議。但是,final不能在子類中覆蓋方法。這將導(dǎo)致get在代理上調(diào)用該方法而不是實(shí)際實(shí)例。

有兩種方法可以解決這個(gè)問題

  1. 刪除final關(guān)鍵字

  2. 引入定義存儲庫合約的接口。這將導(dǎo)致創(chuàng)建 JDK 動態(tài)代理。JDK 動態(tài)代理是基于接口的,不需要子類化您的實(shí)際類(僅適用于基于類的代理)。


查看完整回答
反對 回復(fù) 2021-10-27
  • 1 回答
  • 0 關(guān)注
  • 138 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號