我正在尝试为我的应用程序创建业务逻辑(服务)和存储库(数据访问)层。我想正确地做,但是我不是专家。
目前,对于存储库层,我已经创建了一个接口 IMainDao ,该接口扩展了 JpaRepository :
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface IMainDao extends JpaRepository<Object, Integer>{
}
所以我所有的存储库接口都可以扩展IMainDao:
import org.springframework.stereotype.Repository;
@Repository
public interface IUserDao extends IMainDao{
}
我还创建了业务逻辑层。界面 IMainService :
import java.util.List;
import org.springframework.stereotype.Service;
@Service
public interface IMainService {
Object getById(int id);
List<Object> getAll();
Object create(Object o);
Object update(Object o);
void delete(int id);
}
此接口的实现 MainService
@Service
public class MainService implements IMainService{
@Autowired
private IMainDao mainDao;
@Override
public Object getById(int id) {
return mainDao.findById(id);
}
@Override
public List<Object> getAll() {
return mainDao.findAll();
}
@Override
public Object create(Object o) {
Object obj = mainDao.save(o);
return obj;
}
//Other methods...
以及扩展 IMainService 的其他接口,例如 IUserService :
import org.springframework.stereotype.Service;
@Service
public interface IUserService extends IMainService{
}
及其实现:
public abstract class UserService implements IUserService{
}
我做对了吗?如果没有,您对我有什么建议?在哪里可以优化?
谢谢!
答案 0 :(得分:4)
您的IMainDao
似乎是不必要的。您可以根据需要为实体定义接口,例如:User, Order
@Repository
interface UserRepository extends JpaRepository<User, Long> {}
@Repository
interface OrderRepository extends JpaRepository<Order, Long> {}
而且,在您的业务逻辑层中,您可以具有服务接口及其实现,例如:
@Service
interface UserService{
... method declarations goes here
}
class UserServiceImpl implements UserService {
@Autowired
UserRepository userRepository;
... implement interface methods
}
如果在多个服务类中具有通用方法,则可以具有通用服务接口,否则IMainService
没有任何意义。
==== [编辑]引入一般服务接口====
让我们想象UserService
和OrderService
都有共同的搜索方法。然后,我们可以使用通用服务接口(SearchService
)并将其在所需的服务实现类中实现。
interface SearchService<T, I> {
T findLatestOne(){}
T lastEditedOne(){}
List<T> searchByKeywords{}
}
class UserService implements SerchService<User, Long> {
User findLatestOne(){ ... implementation }
User lastEditedOne(){ ... implementation }
List<User> searchByKeywords{ ... implementation }
}
class OrderService implements SerchService<Order, Long> {
Order findLatestOne(){ ... implementation }
Order lastEditedOne(){ ... implementation }
List<Order> searchByKeywords{ ... implementation }
}
答案 1 :(得分:0)
我建议根据您的实体模型的需要定义存储库。
@Repository
public interface IUserDao extends JpaRepository<User, Long>{
}
实现的API将调整为定义的泛型。
关于服务,请遵循这种方法;向接口开发并实现它们,以依靠注入的存储库来提供具体的功能。虽然,尽量避免服务的继承;在大多数情况下,这并不是真正需要的,除非确实需要某些特定的东西,例如通用逻辑,应该通过泛型将其调整为服务的具体细节。