@Inject在基于子类的抽象类中 [英] @Inject in abstract class based on subclass

查看:204
本文介绍了@Inject在基于子类的抽象类中的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

假设我每个实体都有一个用于数据库访问的存储库类(spring数据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);
    }
}

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

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

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

    // the inherited add() method works now
}

let imagine I have per entity a repository class (spring data jpa) for database access and a service class. The dependencies are managed by spring framework. Every service method does in most cases the same, so there is mainly code duplication:

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

Now i thought about creating an abstract class like this:

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> {

}

My problem: How can i overwrite the repository used inside the abstract class based on my entities?

解决方案

You can replace the UnknownRepository field with an abstract method and a type parameter:

// 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);
    }
}

And inject the specific repository to the implementations of this class:

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

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

    // the inherited add() method works now
}

这篇关于@Inject在基于子类的抽象类中的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆