¿Cuál es la diferencia entre las anotaciones @Component, @Repository & @Service en Spring?

¿Las anotaciones @Component, @Repository y @Service pueden utilizarse indistintamente en Spring o proporcionan alguna funcionalidad concreta además de actuar como dispositivo de notación?

En otras palabras, si tengo una clase Service y cambio la anotación de @Service a @Component, ¿se comportará igual?

¿O la anotación también influye en el comportamiento y la funcionalidad de la clase?

De Documentación de Spring:

En Spring 2.0 y posteriores, la anotación @Repository es un marcador para cualquier clase que cumpla el rol o estereotipo (también conocido como Data

Access Object o DAO) de un repositorio. Entre los usos de este marcador es la traducción automática de excepciones.

Spring 2.5 introduce más anotaciones de estereotipos: @Component, @Service, y @Controller. El estereotipo @Component es un estereotipo genérico para cualquier componente gestionado por Spring. Los componentes "Repository", "Service" y "Controller" son especializaciones de @Component para casos de uso más específicos, por por ejemplo, en las capas de persistencia, servicio y presentación, respectivamente. ; Por lo tanto, puedes anotar tus clases de componentes con @Component, pero al anotarlas con @Repositorio, @Servicio o @Controlador. tus clases son más apropiadas para ser procesadas por herramientas o para asociarlas con aspectos. Por ejemplo, estas anotaciones de estereotipos son objetivos ideales para los pointcuts.

Por lo tanto, si estás eligiendo entre usar @Component o @Service para su capa de servicio, @Service es claramente la mejor opción. Del mismo modo, como se ha dicho antes, @Repository ya está soportado como marcador para traducción automática de excepciones en tu capa de persistencia.

┌────────────┬─────────────────────────────────────────────────────┐
│ Annotation │ Meaning                                             │
├────────────┼─────────────────────────────────────────────────────┤
│ @Component │ generic stereotype for any Spring-managed component │
│ @Repository│ stereotype for persistence layer                    │
│ @Service   │ stereotype for service layer                        │
│ @Controller│ stereotype for presentation layer (spring-mvc)      │
└────────────┴─────────────────────────────────────────────────────┘
Comentarios (12)

Son casi lo mismo - todos ellos significan que la clase es un bean de Spring. Los @Service, @Repository y @Controller son @Componentes especializados. Puedes elegir realizar acciones específicas con ellos. Por ejemplo:

  • Los beans @Controller son utilizados por spring-mvc
  • Los beans @Repository son elegibles para la traducción de excepciones de persistencia

Otra cosa es que designes semánticamente los componentes a diferentes capas.

Una cosa que ofrece @Component es que puedes anotar otras anotaciones con él, y luego usarlas de la misma manera que @Service.

Por ejemplo, recientemente he hecho:

@Component
@Scope("prototype")
public @interface ScheduledJob {..}

Así que todas las clases anotadas con @ScheduledJob son spring beans y además se registran como quartz jobs. Sólo tienes que proporcionar el código que maneja la anotación específica.

Comentarios (3)

El uso de las anotaciones @Service y @Repository es importante desde la perspectiva de la conexión a la base de datos.

  1. Utilice @Service para todas sus conexiones a la base de datos de tipo servicio web
  2. Utilice @Repository para todas sus conexiones a la base de datos de procesos almacenados.

Si no utiliza las anotaciones apropiadas, puede enfrentar excepciones de commit anuladas por transacciones de rollback. Verá excepciones durante la prueba de carga de estrés que están relacionadas con las transacciones JDBC rollback.

Comentarios (2)