Las principales razones por las que tiendo a inclinarme por tener una capa de servicio son las siguientes dos razones...
-
Marcar métodos como @Transactional para que todas las solicitudes de DAO dentro de este método se realicen en una sola transacción.
-
Puedo aumentar la separación de preocupaciones del DAO y los roles de usuario. Puedo marcar los métodos para que requieran ciertos roles de usuario y, como tal, encaja muy bien con Spring Security.
Simplemente puede llamar a un DAO desde el controlador, pero lo deja atascado si desea expandirlo más adelante. Para obtener la conexión, puede marcar el servicio como @Transactional y el DAO como @Repository y Spring se encargará de obtener el objeto de la sesión por usted y la inyección, etc.
Tiendo a pensar (quizás incorrectamente) en la capa de servicio como una fachada a la que se accede, ya sea desde un servicio web o un controlador o lo que sea, mantiene la separación.