应该在服务层中编写哪些方法?

时间:2017-03-11 17:24:35

标签: java spring spring-mvc spring-data-jpa 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方法位于服务层而不是dao层?我读到所有CRUD操作都应该进入dao层。
  2. UserServiceImpl中findByUsername(String username)的用途是什么?我们可以在dao中使用该方法,因为我们使用Spring Data,所以Spring已经实现了这个功能。

2 个答案:

答案 0 :(得分:3)

  1.   

    我读到所有CRUD操作都应该进入dao层。

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

    1.   

      UserServiceImpl中的findByUsername(String username)的用途是什么

    2. 出于同样的原因,findByUsername (String username)在服务中。现在没有任何反应,只是从DAO调用了一个方法。但突然之间,在从DAO调用该方法之前,有必要添加一些逻辑。

答案 1 :(得分:3)

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

这样的业务逻辑

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

因此,尽管Service方法可能类似于DAO或Repository方法,但遵循Controller-&gt; Service-&gt; DAO工作流而不是Controller-&gt; DAO始终是有用的,这样向Service添加业务逻辑将在将来有用。希望能帮助到你。