java - 基于子类的抽象类中的@Inject

标签 java polymorphism

假设我每个实体都有一个用于数据库访问的存储库类(spring data jpa)和一个服务类。依赖关系由 spring 框架管理。每个服务方法在大多数情况下都是相同的,因此主要是代码重复:

public class NewsService {
    @Inject
    private NewsRepository newsRepository;

    public void add(News news) {
        // do some validation
        newsRepository.save(news);
    }
}

public class UserService {
    @Inject
    private UserRepository userRepository;

    public void add(User user) {
        // do some validation
        userRepository.save(user);
    }
}

现在我考虑创建一个像这样的抽象类:

public abstract class AbstractService<T> {
    private UnknownRepository unknownRepository;

    public void add(T entity) {
        // do some validation
        unknownRepository.save(entity);
    }
}

public class NewsService extends AbstractService<News> {

}

public class UserService extends AbstractService<User> {

}

我的问题:如何根据我的实体覆盖抽象类中使用的存储库?

最佳答案

您可以用抽象方法和类型参数替换 UnknownRepository 字段:

// R is the type of the repository
public abstract class AbstractService<T,R extends BaseRepository> {
    protected abstract R getRepository();

    public void add(T entity) {
        getRepository().save(entity);
    }
}

并将特定存储库注入(inject)到此类的实现中:

public class NewsService extends AbstractService<News, NewsRepository> {
    @Inject private NewsRepository newsRepository;

    @Override
    public NewsRepository getRepository() {
        return newsRepository;
    }

    // the inherited add() method works now
}

关于java - 基于子类的抽象类中的@Inject,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22507041/

相关文章:

c++ - 为什么派生类中的重写函数会隐藏基类的其他重载?

c++ - 从基类调用虚函数

java - 在Java程序中执行bat文件

java - 如何使用二维按钮阵列刷新面板?

java - Android - 检查单选按钮已选中

java - 在特定情况下如何使 JRadioButton 透明?

java - 我想删除 Firebase 数据库子项,但我不能

C++ 我应该使用虚拟方法吗?

c++ - 一元 - 使用友元函数重载运算符

c++ - 虚拟构造函数