¿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?
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) │
└────────────┴─────────────────────────────────────────────────────┘
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:
@Controller
son utilizados por spring-mvc@Repository
son elegibles para la traducción de excepciones de persistenciaOtra 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.
El uso de las anotaciones @Service
y @Repository
es importante desde la perspectiva de la conexión a la base de datos.
@Service
para todas sus conexiones a la base de datos de tipo servicio web@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.