Service层应该写什么方法?

What methods should be written in the Service Layer?

我尝试遵循有关 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数据,所以Spring已经实现了这个功能。
  1. I read that all CRUD operations should go in the dao layer.

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

  1. What the purpose of findByUsername(String username) in UserServiceImpl

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

网上的大多数初学者教程都将服务方法显示为愚蠢的,它们最终只是通过调用 DAO 保存方法将保存操作委托给 DAO,如您的 save() 方法示例所示。但在现实世界的应用程序中,至少有 50% 的时间你需要编写一些业务逻辑,例如

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

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