2017-03-11 1 views
3

J'essaie de suivre un tutoriel sur Spring MVC. Dans le tutoriel, il est l'interface UserDao (printemps données JPA est utilisé)Quelles méthodes doivent être écrites dans la couche Service?

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

Aussi il y a le UserService et 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. Pourquoi méthode d'enregistrement est dans la couche de service et non dans le Dao couche? J'ai lu que toutes les opérations CRUD devraient aller dans la couche dao.
  2. Quel est le but de findByUsername (String username) dans UserServiceImpl? Nous pouvons utiliser la méthode dans dao, car nous utilisons Spring Data, donc Spring a déjà implémenté cette fonctionnalité.
+0

Voir cette question http://stackoverflow.com/q/3885675/217324 –

Répondre

2
  1. Je lis que toutes les opérations CRUD devraient aller dans la couche dao.

Vous avez raison. userDao.save(user) - c'est CRUD. Mais définissez un mot de passe et ajoutez les rôles - cela fait partie de la logique métier. La couche DAO ne devrait rien savoir de la logique métier. Dans ce cas, la couche dao devrait simplement prendre user et l'enregistrer en db. C'est tout.

  1. Ce que le but de findByUsername (username String) dans UserServiceImpl

Pour la même raison, findByUsername (String username) est dans le service. C'est maintenant rien ne se passe et juste une méthode est appelée à partir du DAO. Mais tout d'un coup, il sera nécessaire d'ajouter de la logique avant d'appeler la méthode depuis le DAO.

1

La plupart des didacticiels pour débutants sur le réseau montrent des méthodes de service comme stupides et ils finissent par déléguer l'opération de sauvegarde à DAO en appelant la méthode de sauvegarde DAO, comme dans votre exemple de méthode save(). Mais dans les applications du monde réel, au moins 50% des fois vous aurez une logique métier à écrire comme

1) La validation de l'utilisateur peut prendre une certaine action. 2) Vérifiez une condition pré ou post avant la mise à jour des données. 3) Assurez-vous que d'autres données existent avant d'enregistrer etc.

Ainsi, même si la méthode Service peut être similaire à la méthode DAO ou Repository, il est toujours utile de suivre le flux de travail Controller-> Service-> DAO au lieu du contrôleur. -> DAO afin que l'ajout de la logique métier au service soit utile à l'avenir. J'espère que cela aide.