【问题标题】:Service layer in Java or Only RepositoryJava 中的服务层或仅存储库
【发布时间】:2017-07-07 19:54:36
【问题描述】:

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

示例服务

@Service
public class RepositoryOperations{

@Autowired
ProductRepository productRepository;

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

...

}

【问题讨论】:

  • 这与您拥有的应用程序类型非常相关。例如,从我的角度来看,如果您有一个 RESTful 微服务,那么将您的存储库注入控制器是非常好的。
  • 注入控制器?你是什​​么意思,在什么意义上?
  • 您的控制器是否需要进行多个 DAO 调用?这些调用是否必须在 same 数据库事务中?如果是,那么您需要一个服务层,以便它可以实现需要在单个事务中调用多个 DAO 的业务逻辑。 --- 您是否有可以从多个位置调用的业务逻辑,例如UI 控制器和 Web 服务端点都需要做同样的事情吗?如果是这样,您需要一个带有业务逻辑的服务层。 --- 这一切都取决于您的应用程序的复杂性。问题太宽泛,无法给出好的答案。

标签: java spring


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

    我们一般保持三层。

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

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

    @Transactional 注释用于当您希望代码在失败时回滚。如果您的服务对三个不同的操作进行了三个 dao 调用,并且您希望这三个操作全部执行或不执行,请使用 @Transactional
    注释您的服务方法 dao 方法也是如此。
    所以你现在有相当多的信息可以决定。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-21
      • 2011-03-03
      • 2011-05-21
      • 1970-01-01
      相关资源
      最近更新 更多