为了账号安全,请及时绑定邮箱和手机立即绑定

为什么添加超类会破坏我的 Spring bean?

为什么添加超类会破坏我的 Spring bean?

芜湖不芜 2021-10-27 16:48:23
我有一个运行正常的 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在代理上调用该方法而不是实际实例。

有两种方法可以解决这个问题

  1. 删除final关键字

  2. 引入定义存储库合约的接口。这将导致创建 JDK 动态代理。JDK 动态代理是基于接口的,不需要子类化您的实际类(仅适用于基于类的代理)。


查看完整回答
反对 回复 2021-10-27
  • 1 回答
  • 0 关注
  • 122 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信