杂物与服务

时间:2018-09-26 12:47:06

标签: java spring encapsulation

我正在使用Crud和Spring MVC,并且陷入了将相同代码复制到不同存储库的困境;

f.e。如果我使用客户,物品和登录名,则

public interface CustomerRepository extends CrudRepository<Customer, Long>{

}

但与Item我有相同的东西:

public interface ItemRepository extends CrudRepository<Item, Long>{

}

此外,存储库中有相同的方法,例如findAll(),findDistinctBy ...(),deleteAll()等。

据我所知,好的做法是转义代码重复,但是我应该在哪里做呢?在服务中,使用特殊的服务接口并通过特殊的类实现它,然后为每个实体专门化服务?还是我应该像我在Spring Data JPA官方参考文档spring data reference $4.3.1中所说的那样在我的自定义存储库中这样做?

我的带有服务代码的变体如下。 所有实体的通用界面

import org.springframework.data.repository.CrudRepository;

public interface MyCrudService<T>{

    <S extends CrudRepository<T, Long>> Iterable<T> findAll(S s);
}

实现服务的通用类

import org.springframework.data.repository.CrudRepository;

public class MyCrudServiceImpl<T> implements MyCrudService<T>{

    @Override
    public <S extends CrudRepository<T, Long>> Iterable<T> findAll(S s) {
        return s.findAll();
    }
}

单位实体的特殊服务类别

@Service
@Transactional
@AllArgsConstructor
public class MyUnitServiceTwo{

    UnitRepository unitRepository;
    MyCrudServiceImpl crudService;

    public List<Unit> findAll1() {
        return Lists.newArrayList(crudService.findAll(unitRepository));
    }
 }

0 个答案:

没有答案