我有一個(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è)問題
刪除
final
關(guān)鍵字引入定義存儲庫合約的接口。這將導(dǎo)致創(chuàng)建 JDK 動態(tài)代理。JDK 動態(tài)代理是基于接口的,不需要子類化您的實(shí)際類(僅適用于基于類的代理)。
添加回答
舉報(bào)
0/150
提交
取消