如何用Java Spring Boot实现业务逻辑层和存储库层



我正在尝试为我的应用程序创建业务逻辑(服务(和存储库(数据访问(层。我想正确地做这件事,但我不是专家。

目前,对于Repository层,我创建了一个接口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...

其他接口,如IUserService,扩展IMainService:

import org.springframework.stereotype.Service;
@Service
public interface IUserService extends IMainService{
}

与他们的实施:

public abstract class UserService implements IUserService{
}

我做得对吗?如果没有,你向我推荐什么?我可以在哪里进行优化?

谢谢!

您的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就没有意义了。

====[EDIT]引入通用服务接口====

让我们假设UserServiceOrderService都有共同的搜索方法。然后我们可以有一个通用服务接口(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 }
}

我建议根据实体模型的需要定义存储库。

@Repository
public interface IUserDao extends JpaRepository<User, Long>{
}

实现的API将根据定义的泛型进行调整。

关于服务,遵循这种方法;依靠注入的存储库,向接口发展并实现它们以提供具体的功能。尽管如此,还是要尽量避免在服务中继承;大多数情况下,这并不是真正需要的,除非有真正特定的东西来保证,比如通过泛型应该根据服务的具体情况进行调整的公共逻辑。

最新更新