Java 中的服务层或仅存储库

Mar*_*dek 5 java spring

如果我有包含保存、删除和修改操作的 Spring 数据存储库。我应该在服务层创建以下方法操作吗?并添加注释@Transactional?还是让它们保持原样?或者我应该将它们放在存储库层中?

示例服务

@Service
public class RepositoryOperations{

@Autowired
ProductRepository productRepository;

@Transactional
public void saveProduct(){
    productRepository.save();
    }

...

}
Run Code Online (Sandbox Code Playgroud)

小智 5

我认为您对代码使用了一种很好的方法。您可以创建一个将调用产品存储库方法的服务层,以分离职责(业务与数据逻辑)。

三层架构将您的方法描述如下:

  • 控制器:处理进入系统的所有输入值(例如来自端点)并将它们传递给服务。在 Spring 中,您可以使用 @Controller 类注释来将它们与其他组件区分开来。
  • 服务:处理与您的应用程序相关的所有业务逻辑的组件。您可以使用@Service 注释。
  • DAO(数据访问对象):包含数据逻辑的类(在您的情况下是存储库)。您可以使用@Repository 注释。

为了防止出现问题时您的 saveProduct() 服务方法出现任何不一致,您可以使用 @Transactional 批注来回滚您的方法在数据库中所做的所有更改,因此我认为使用该批注是一种很好的做法当您在数据库中进行写入操作时。


roh*_*wal 1

我们一般保留三层。

  1. 控制器定义 API 端点并调用适当的服务来处理请求。
  2. 服务层包含业务逻辑,旨在执行我们所说的繁重处理。如果service层需要从数据库保存或检索数据,它将使用dao层来实现。
  3. Dao 层的唯一作用是从数据库中保存或检索数据并将其提供回服务层。它不应包含任何业务逻辑。

使用注释来注释您的 dao 层 使用@Repository
注释来注释您的服务层@Service
使用注释或 @RestController 来注释您的控制器@Controller(如果您有 REST API)

@Transactional当您希望代码在失败时回滚时,可以使用注释。如果您的服务为三个不同的操作发出三个 dao 调用,并且您希望执行这三个操作的全部或全部都不执​​行,请使用@Transactional
Same apply for dao 方法注释您的服务方法。
所以你现在有相当多的信息可以做出决定。