我有一个运行正常的 Spring Boot Web 应用程序。我注意到两个@Repositorybean 有很多共同点,所以我使用抽象超类重构了它们,现在我的应用程序坏了。我已经仔细检查过,这是我在工作状态和非工作状态之间所做的唯一更改。谁能看到我做错了什么?这是我的工作代码: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); ... }}这是我重构的代码,我在其中引入了一个抽象的通用超类。
1 回答
收到一只叮咚
TA贡献1821条经验 获得超4个赞
不是你引入了父类,而是你把get
方法变成了final
方法。
带有注释的类@Repository
将获得自动异常翻译。这种自动异常转换是通过使用 AOP 添加的。在 Spring 中应用 AOP 的默认机制是使用代理,在这种情况下是基于类的代理。
发生的事情是 CgLib 通过子类化为您的类创建代理,以便在调用方法时可以添加建议。但是,final
不能在子类中覆盖方法。这将导致get
在代理上调用该方法而不是实际实例。
有两种方法可以解决这个问题
删除
final
关键字引入定义存储库合约的接口。这将导致创建 JDK 动态代理。JDK 动态代理是基于接口的,不需要子类化您的实际类(仅适用于基于类的代理)。
添加回答
举报
0/150
提交
取消