【问题标题】:How to implement a generic service class in java Spring Boot?java - 如何在java Spring Boot中实现一个通用服务类?
【发布时间】:2019-01-08 12:07:41
【问题描述】:

我有许多具有重复代码的服务,我想知道如何实现一个通用服务,以便我的所有服务都可以扩展它。

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

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

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

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

@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...

}

@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...

    }

【问题讨论】:

  • @ChrisTurner,这意味着 DAO 也需要是通用的。更新了示例。
  • 服务是否只是暴露了底层的dao,方法对方法,没有其他业务逻辑等?如果是这样,那何必呢?
  • @RobertMoskal,我敢肯定真正的实现要复杂得多:)
  • 是的,真正的实现更复杂。这只是一个例子。
  • @metacubed 如何实现通用 DAO?

标签: java spring spring-boot spring-data-jpa spring-data


【解决方案1】:

使用Java generics 相当简单。可以用类型参数替换实际类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();
}

然后对实现做同样的事情:

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

}

更进一步,您还可以将实际服务创建为:

@Service
class UserService extends GenericService<User> { }

@Service
class EventService extends GenericService<Event> { }

这是来自 Java 文档的一个很好的教程:Learning the Java Language: Generics

另一个很好的例子:The Basics of Java Generics

【讨论】:

  • 这种方法真的对代码进行了重复数据删除吗?
  • @RobertMoskal,嗯,我不确定你的意思。它确实对用户与事件服务进行了重复数据删除。而且我确信真正的代码要复杂得多。
  • @RobertMoskal,我会进一步澄清答案。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-24
  • 2011-04-10
  • 2015-12-29
  • 2017-06-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多