我尝试按照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);
}
}
答案 0 :(得分:3)
我读到所有CRUD操作都应该进入dao层。
你是对的。 userDao.save(user)
- 这是CRUD。但是设置密码并添加角色 - 它是业务逻辑的一部分。 DAO层应该对业务逻辑一无所知。在这种情况下,dao层应该只准备好user
并将其保存到db中。多数民众赞成。
UserServiceImpl中的findByUsername(String username)的用途是什么
出于同样的原因,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添加业务逻辑将在将来有用。希望能帮助到你。