@Servicio vs @Controller
@Service: class es una "Fachada de servicios empresariales" (en el sentido de los patrones Core J2EE) o algo similar.
@Controller: indica que una clase anotada es un "controlador" (por ejemplo, un controlador web).
---------- Encuentra notas útiles sobre los principales estereotipos
http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/stereotype/Component.html
@interface Componente
@Target(value=TYPE)
@Retention(value=RUNTIME)
@Documented
public @interface Component
Indica que una clase anotada es un componente. Estas clases se consideran candidatas para la detección automática cuando se utiliza una configuración basada en anotaciones y un escaneo de rutas de clases.
También se pueden considerar otras anotaciones a nivel de clase como identificación de un componente, normalmente un tipo especial de componente: por ejemplo, la anotación @Repository o la anotación @Aspect de AspectJ.
@ controlador de interfaz
@Target(value=TYPE)
@Retention(value=RUNTIME)
@Documented
@Component
public @interface Controller
Indica que una clase anotada es un "controlador" (por ejemplo, un controlador web).
Esta anotación sirve como una especialización de @Component, lo que permite que las clases de implementación se detecten automáticamente a través del escaneo de classpath. Por lo general, se usa en combinación con métodos de controlador anotados basados en la anotación RequestMapping.
@ servicio de interfaz
@Target(value=TYPE)
@Retention(value=RUNTIME)
@Documented
@Component
public @interface Service
Indica que una clase anotada es un "Servicio", originalmente definido por Domain-Driven Design (Evans, 2003) como "una operación ofrecida como una interfaz que está sola en el modelo, sin un estado encapsulado". También puede indicar que una clase es una "Fachada de servicios comerciales" (en el sentido de los patrones Core J2EE) o algo similar. Esta anotación es un estereotipo de propósito general y los equipos individuales pueden limitar su semántica y utilizarla según corresponda.
Esta anotación sirve como una especialización de @Component, lo que permite que las clases de implementación se detecten automáticamente a través del escaneo de classpath.
@interface Repositorio
@Target(value=TYPE)
@Retention(value=RUNTIME)
@Documented
@Component
public @interface Repository
Indica que una clase anotada es un "Repositorio", originalmente definido por Domain-Driven Design (Evans, 2003) como "un mecanismo para encapsular el comportamiento de almacenamiento, recuperación y búsqueda que emula una colección de objetos". Los equipos que implementan patrones J2EE tradicionales como "Objeto de acceso a datos" también pueden aplicar este estereotipo a las clases DAO, aunque se debe tener cuidado de comprender la distinción entre Objetos de acceso a datos y repositorios de estilo DDD antes de hacerlo. Esta anotación es un estereotipo de propósito general y los equipos individuales pueden limitar su semántica y usarla según corresponda.
Una clase así anotada es elegible para la traducción Spring DataAccessException cuando se usa junto con un PersistenceExceptionTranslationPostProcessor. La clase anotada también se aclara en cuanto a su papel en la arquitectura general de la aplicación con el propósito de herramientas, aspectos, etc.
A partir de Spring 2.5, esta anotación también sirve como una especialización de @Component, lo que permite que las clases de implementación se detecten automáticamente a través del escaneo de classpath.