【问题标题】:What methods should be written in the Service Layer?服务层应该写什么方法?
【发布时间】:2017-08-01 23:22:33
【问题描述】:

我尝试遵循有关 Spring MVC 的教程。教程中有UserDao接口(使用Spring Data JPA)

public interface UserDao extends JpaRepository<User, Long> {
    User findByUsername(String username);
}

还有UserService和UserServiceImpl

public interface UserService {
    void save(User user);

    User findByUsername(String username);
}

@Service
public class UserServiceImpl implements UserService {

    @Autowired
    private UserDao userDao;

    @Autowired
    private RoleDao roleDao;

    @Autowired
    private BCryptPasswordEncoder bCryptPasswordEncoder;

    @Override
    public void save(User user) {
        user.setPassword(bCryptPasswordEncoder.encode(user.getPassword()));
        Set<Role> roles = new HashSet<>();
        roles.add(roleDao.getOne(1L));
        user.setRoles(roles);
        userDao.save(user);
    }

    @Override
    public User findByUsername(String username) {
        return userDao.findByUsername(username);
    }
}
  1. 为什么save方法在Service层而不在dao层?我读到所有的 CRUD 操作都应该放在 dao 层。
  2. 在 UserServiceImpl 中 findByUsername(String username) 的目的是什么?我们可以使用dao中的方法,因为我们使用的是Spring Data,所以Spring已经实现了这个功能。

【问题讨论】:

标签: java spring spring-mvc spring-data-jpa service-layer


【解决方案1】:
  1. 我读到所有的 CRUD 操作都应该放在 dao 层。

你是对的。 userDao.save(user) - 这是 CRUD。但是设置密码并添加角色 - 这是业务逻辑的一部分。 DAO 层应该对业务逻辑一无所知。在这种情况下,dao 层应该只使用准备好的user 并将其保存到数据库中。就是这样。

  1. UserServiceImpl中findByUsername(String username)的作用是什么

出于同样的原因,findByUsername (String username) 在服务中。现在什么都没有发生,只是从 DAO 调用了一个方法。但是突然之间,在从 DAO 调用方法之前,需要添加一些逻辑。

【讨论】:

    【解决方案2】:

    网络上的大多数初学者教程都将 Service 方法显示为愚蠢,他们最终只是通过调用 DAO 保存方法将保存操作委托给 DAO,就像您的 save() 方法示例一样。但在现实世界的应用程序中,至少有 50% 的情况下你会写一些业务逻辑,比如

    1) 验证用户可以采取一些行动。 2) 在数据更新前检查前置或后置条件。 3)在保存等之前确保一些其他数据存在。

    因此,即使 Service 方法可能类似于 DAO 或 Repository 方法,遵循 Controller->Service->DAO 工作流而不是 Controller->DAO 总是有用的,这样向 Service 添加业务逻辑将在未来。希望能帮助到你。

    【讨论】:

      猜你喜欢
      • 2011-06-13
      • 2011-01-20
      • 2018-08-01
      • 2021-04-06
      • 2020-11-22
      • 2011-06-10
      • 2022-01-05
      • 2013-07-01
      • 2011-05-04
      相关资源
      最近更新 更多