gpt4 book ai didi

java - 把Spring中的JpaRepository暴露给客户端可以吗?

转载 作者:行者123 更新时间:2023-11-30 05:50:39 25 4
gpt4 key购买 nike

我有一个关于在 Spring 中使用 JpaRepository 的概念性 OO 问题。将 JpaRepository 公开给调用者并让他们在该实例上调用 CRUD 方法是否可以,或者我必须包装每个方法并仅从服务中调用相应的 JpaRepository 方法?

在代码中:

public interface MyJpa extends JpaRepository<MyEntity, Long>

然后:

@Repository
public class MyDbService{

@Autowired
private MyJpa myJpa;

public Iterable<MyEntity> findAll()
{
return myJpa.findAll()
}

... other CRUD methods

}

然后客户端会做:

Iterable<MyEntity> entities = myDbService.findAll();

相对于:

@Repository
public class MyDbService{

@Autowired
private MyJpa myJpa;

public MyJpa getJpa() {
return myJpa
};
}

然后客户端会做:

Iterable<MyEntity> entities = myDbService.getJpa().findAll();

不使用第二种方法的主要问题是什么?

最佳答案

我更喜欢后一种方法。在我处理的应用程序中,我通常有以下层(层数可能更多或更少 - 这是一个非常粗略的准则):

第 1 层 - 客户层

可能是 Spring MVC @Controller@Service。例如:

@Controller
public class MyController {
@Autowired private MyManager myManager; // see Layer 2
}

第 2 层 - 业务层

第 2 层提供客户端层和 DAO 之间的分离。它通常是 1 个或多个 DAO 之上的外观。你可以把业务逻辑/规则放在这里,或者委托(delegate),或者添加另一个层。例如:

@Component
public class MyManagerImpl implements MyManager {
@Autowired private MyDao myDao; // see layer 3
}

第 3 层 - DAO 层

第 3 层是您的 DAO 或 @Repository 类。根据您的示例:

public interface MyDao extends JpaRepository<MyEntity, Long> {
// Spring Data JPA magic here!
}

一些一般性的建议:

  • 没有严格的规定,每个应用程序都是不同的。在您的应用程序要求的背景下做对您有意义的事情
  • 每一层应该只有一个职责。如果您发现一个层具有多重职责(例如数据访问和客户端 API),那么最好将它分成两部分

最后,我要在您的示例中做的一个小改动是使用 @Component 而不是 @Repository 注释 MyDbService@Repository 应仅限于 DAO。

希望漫无边际的是有道理的!

关于java - 把Spring中的JpaRepository暴露给客户端可以吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13792209/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com