如何在Java Spring Boot中实现通用服务类?

Lui*_*man 3 java spring spring-data spring-data-jpa spring-boot

我有许多具有重复代码的服务,并且我想知道如何实现通用服务,以便我所有的服务都可以对其进行扩展。

服务接口示例(重复的代码):

@Service
public interface IUserService{    
    List<User> findAll();
    User save(User entity);
    User findById(long id);
    void delete(User entity);
    void deleteById(long id);
    long count();
}
Run Code Online (Sandbox Code Playgroud)
@Service
public interface IEventService{ 

    List<Event> findAll();
    Event save(Event entity);
    Event findById(long id);
    void delete(Event entity);
    void deleteById(long id);
    long count();
}
Run Code Online (Sandbox Code Playgroud)

及其实现(现在,我在所有实现中都有相同的代码):

@Service
public class EventService implements IEventService{

    @Autowired
    private IEventDao dao;

    @Override
    public List<Event> findAll() {
        return dao.findAll();
    }

    @Override
    public Event save(Event entity) {
        return dao.save(entity);
    }

   Other CRUD methods...

}
Run Code Online (Sandbox Code Playgroud)
@Service
    public class UserService implements IUserService{

        @Autowired
        private IUserDao dao;

        @Override
        public List<User> findAll() {
            return dao.findAll();
        }

        @Override
        public User save(User entity) {
            return dao.save(entity);
        }

       Other CRUD methods...

    }
Run Code Online (Sandbox Code Playgroud)

met*_*bed 7

使用Java泛型非常简单。您可以替换的实际类UserEvent与一类参数等。

public interface IGenericService<T> {    
    List<T> findAll();
    T save(T entity);
    T findById(long id);
    void delete(T entity);
    void deleteById(long id);
    long count();
}
Run Code Online (Sandbox Code Playgroud)

然后对实现执行相同操作:

public class GenericService<T> implements IGenericService<T> {

    // The DAO class will also need to be generic,
    // so that it can use the right class types
    @Autowired
    private IDao<T> dao;

    @Override
    public List<T> findAll() {
        return dao.findAll();
    }

    @Override
    public T save(T entity) {
        return dao.save(entity);
    }

    // Other CRUD methods...

}
Run Code Online (Sandbox Code Playgroud)

更进一步,您还可以按照以下方式创建实际服务:

@Service
class UserService extends GenericService<User> { }

@Service
class EventService extends GenericService<Event> { }
Run Code Online (Sandbox Code Playgroud)

这是Java文档中的一个很好的教程:学习Java语言:泛型

另一个具有良好示例的示例:Java泛型基础知识