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);
}
}
- 为什么save方法在Service层而不是dao层?我读到所有CRUD操作都应该放在dao层。
- UserServiceImpl 中 findByUsername(String username) 的用途是什么?我们可以使用dao中的方法,因为我们使用了Spring数据,所以Spring已经实现了这个功能。
I read that all CRUD operations should go in the dao layer.
你是对的。 userDao.save(user)
- 这是 CRUD。但是设置密码和添加角色——这是业务逻辑的一部分。 DAO 层应该对业务逻辑一无所知。在这种情况下,dao 层应该只使用准备好的 user
并将其保存到 db 中。就这些了。
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将来有用。希望能帮助到你。
我尝试遵循有关 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);
}
}
- 为什么save方法在Service层而不是dao层?我读到所有CRUD操作都应该放在dao层。
- UserServiceImpl 中 findByUsername(String username) 的用途是什么?我们可以使用dao中的方法,因为我们使用了Spring数据,所以Spring已经实现了这个功能。
I read that all CRUD operations should go in the dao layer.
你是对的。 userDao.save(user)
- 这是 CRUD。但是设置密码和添加角色——这是业务逻辑的一部分。 DAO 层应该对业务逻辑一无所知。在这种情况下,dao 层应该只使用准备好的 user
并将其保存到 db 中。就这些了。
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将来有用。希望能帮助到你。