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

我有一个运行正常的 Spring Boot Web 应用程序。我注意到两个@Repositorybean 有很多共同点,所以我使用抽象超类重构了它们,现在我的应用程序坏了。我已经仔细检查过,这是我在工作状态和非工作状态之间所做的唯一更改。谁能看到我做错了什么?


这是我的工作代码:


public class One { ... }

public class Two { ... }


@Repository

public 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);

    }

}


@Repository

public 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);

    }

}


@Service

public 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);

        ...

    }

}

这是我重构的代码,我在其中引入了一个抽象的通用超类。


芜湖不芜
浏览 123回答 1
1回答

收到一只叮咚

不是你引入了父类,而是你把get方法变成了final方法。带有注释的类@Repository将获得自动异常翻译。这种自动异常转换是通过使用 AOP 添加的。在 Spring 中应用 AOP 的默认机制是使用代理,在这种情况下是基于类的代理。发生的事情是 CgLib 通过子类化为您的类创建代理,以便在调用方法时可以添加建议。但是,final不能在子类中覆盖方法。这将导致get在代理上调用该方法而不是实际实例。有两种方法可以解决这个问题删除final关键字引入定义存储库合约的接口。这将导致创建 JDK 动态代理。JDK 动态代理是基于接口的,不需要子类化您的实际类(仅适用于基于类的代理)。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java