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


Poder @Component, @Repository y @Service las anotaciones se usan indistintamente en Spring o proporcionan alguna funcionalidad particular además de actuar como un dispositivo de notación?

En otras palabras, si tengo una clase de servicio y cambio la anotación de @Service a @Component, ¿seguirá comportándose de la misma manera?

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


1515
2017-07-26 09:10


origen


Respuestas:


De Documentación de primavera:

En la primavera 2.0 y posterior, el @Repository la anotación es un marcador para   cualquier clase que cumpla el rol o estereotipo (también conocido como Datos)   Objeto de acceso 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,    @Servicey @Controller. @Component es un estereotipo genérico para cualquier   Componente gestionado por Spring. @Repository, @Servicey @Controller son   especializaciones de @Component para casos de uso más específicos, para   ejemplo, en las capas de persistencia, servicio y presentación,   respectivamente.

Por lo tanto, puede anotar sus clases de componentes con @Component,   pero anotándolos con @Repository, @Service, o @Controller   en cambio, sus clases son más adecuadas para el procesamiento por herramientas   o asociarse con aspectos. Por ejemplo, estas anotaciones de estereotipos   hacer objetivos ideales para los puntos de corte.

Por lo tanto, si elige entre usar @Component o @Service para   su capa de servicio, @Service es claramente la mejor opción. Similar,   como se indicó anteriormente, @Repository ya es compatible como un marcador para   traducción de excepción automática en su 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)      │
└────────────┴─────────────────────────────────────────────────────┘

1110
2017-08-01 10:20



Como muchas de las respuestas ya indican para qué se usan estas anotaciones, aquí nos centraremos en algunas pequeñas diferencias entre ellas.

Primero el Semejanza 

El primer punto que vale la pena destacar nuevamente es que con respecto a la detección automática de escaneo y la inyección de dependencia para BeanDefinition todas estas anotaciones (viz., @Component, @Service,   @Repository, @Controller) son lo mismo. Podemos usar uno en su lugar   de otro y todavía puede seguir nuestro camino.


Diferencias entre @Component, @Repository, @Controller y @Service

@Componente

Esta es una anotación de estereotipo de propósito general que indica que la clase es un componente de primavera.

Qué tiene de especial @Component
<context:component-scan> solo escaneos @Component y no busca @Controller, @Service y @Repository en general. Se escanean porque ellos mismos están anotados con @Component.

Solo eche un vistazo a @Controller, @Service y @Repository definiciones de anotación:

@Component
public @interface Service {
    ….
}

@Component
public @interface Repository {
    ….
}

@Component
public @interface Controller {
    …
}

Por lo tanto, no está mal decir que @Controller, @Service y @Repository son tipos especiales de @Component anotación. <context:component-scan> los recoge y registra sus siguientes clases como frijoles, como si estuvieran anotados con @Component.

Se escanean porque ellos mismos están anotados con @Component anotación. Si definimos nuestra propia anotación personalizada y la anotamos con @Component, luego también se escaneará con <context:component-scan>


@Repositorio

Esto es para indicar que la clase define un depósito de datos.

¿Qué tiene de especial el @Repository? 

Además de señalar que este es un Configuración basada en anotaciones, @RepositoryEl trabajo es capturar excepciones específicas de la plataforma y volver a lanzarlas como una de la excepción no verificada unificada de Spring. Y para esto, estamos provistos de PersistenceExceptionTranslationPostProcessor, que debemos agregar en el contexto de aplicación de Spring de esta manera:

<bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor"/>

Este post procesador de frijoles agrega un asesor a cualquier frijol anotado con @Repository de modo que cualquier excepción específica de la plataforma sea capturada y luego presentada de nuevo como una de las excepciones de acceso a datos sin marcar de Spring.


@Controlador

los @Controller la anotación indica que una clase en particular cumple la función de un controlador. los @Controller la anotación actúa como un estereotipo para la clase anotada, lo que indica su función.

¿Qué tiene de especial @Controller? 

No podemos cambiar esta anotación con otra similar @Service o @Repository, a pesar de que se ven iguales. El despachador escanea las clases anotadas con @Controller y detecta @RequestMapping anotaciones dentro de ellos. Solo podemos usar @RequestMapping en @Controller clases anotadas


@Servicio

@Services mantener la lógica comercial y el método de llamada en la capa de repositorio.

¿Qué tiene de especial @Service? 

Además del hecho de que se usa para indicar que mantiene la lógica comercial, no hay una especialidad notable que proporcione esta anotación, pero quién sabe si la primavera puede agregar alguna excepción adicional en el futuro.


¿Qué más?

Similar a lo anterior, en el futuro Spring puede optar por agregar funcionalidades especiales para @Service, @Controller y @Repository basado en sus convenciones de capas Por lo tanto, siempre es una buena idea respetar la convención y usarlos en línea con las capas.


423
2017-07-24 06:43



Son casi lo mismo, todos ellos significan que la clase es un Spring Bean. @Service, @Repository y @Controller están especializados @Components. Puede elegir realizar acciones específicas con ellos. Por ejemplo:

  • @Controller los frijoles son usados ​​por spring-mvc
  • @Repository los frijoles son elegibles para la traducción de excepción de persistencia

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

Una cosa que @Component ofertas es que puede anotar otras anotaciones con ella, y luego usarlas de la misma manera que @Service.

Por ejemplo, recientemente hice:

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

Entonces todas las clases anotadas con @ScheduledJob son granos de primavera y, además de eso, están registrados como trabajos de cuarzo. Solo debe proporcionar un código que maneje la anotación específica.


388
2017-07-26 09:16



@Component es equivalente a

<bean>

@Service, @Controller, @Repository = {@Component + algunas funciones más especiales}

Eso significa que Service, The Controller y Repository son funcionalmente iguales.

Las tres anotaciones se usan para separar "Capas" en tu aplicación,

  • Los controladores simplemente hacen cosas como despachar, reenviar, llamar a métodos de servicio, etc.
  • Service Hold business Logic, Cálculos, etc.
  • Los repositorios son los DAO (Objetos de acceso a datos) y acceden directamente a la base de datos.

Ahora puedes preguntar por qué separarlos: (Supongo que conoces la programación orientada a aspectos de AOP)

Digamos que desea monitorear la actividad de la capa DAO solamente. Escribirá una clase Aspect (Clase A) que realice un registro antes y después de que se invoque cada método de su DAO, puede hacerlo utilizando AOP ya que tiene tres capas distintas y no está mezclado.

Entonces puede hacer el registro de DAO "alrededor", "antes" o "después" de los métodos DAO. Usted podría hacer eso porque tenía un DAO en primer lugar. Lo que acabas de lograr es Separación de preocupaciones o tareas.

Imagínese si hubiera solo una anotación @Controller, entonces este componente tendrá despachador, lógica de negocios y base de datos de acceso, todo mezclado, ¡código tan sucio!

Más arriba mencionado es un escenario muy común, hay muchos más casos de uso de por qué usar tres anotaciones.


332
2018-05-23 05:15



En primavera @Component, @Service, @Controllery @Repository son anotaciones estereotipadas que se usan para:

@Controller: donde su solicitud  mapeo desde la página de presentación hecho, es decir, la capa de presentación no irá a ningún otro archivo al que vaya directamente @Controller clase y verifica la ruta solicitada en @RequestMapping anotación escrita antes de las llamadas al método si es necesario.

@Service: Toda la lógica empresarial está aquí, es decir, los cálculos relacionados con los datos y todo. Esta anotación de la capa empresarial en la que nuestro usuario no llama directamente al método de persistencia llamará a este método utilizando esta anotación. Se solicitará @Repository según la solicitud del usuario

@Repository: Esta es la capa de persistencia (capa de acceso a datos) de la aplicación que solía obtener datos de la base de datos. es decir todas las operaciones relacionadas con la Base de Datos son realizadas por el repositorio.

@Component - Anote sus otros componentes (por ejemplo, clases de recursos REST) ​​con un estereotipo de componente.

Indica que una clase anotada es un "componente". Tales clases son   considerados como candidatos para autodetección al usar   análisis basado en anotaciones y classpath.

Se pueden considerar otras anotaciones a nivel de clase como identificar un   componente también, generalmente un tipo especial de componente: p. el   @Anotación de repositorio o Asignación @Aspect de AspectJ.

enter image description here


188
2018-03-25 08:00



Spring 2.5 introduce más anotaciones de estereotipo: @Component, @Service y @Controller. @Component sirve como un estereotipo genérico para cualquier componente gestionado por Spring; mientras que, @Repository, @Service y @Controller sirven como especializaciones de @Component para casos de uso más específicos (por ejemplo, en las capas de persistencia, servicio y presentación, respectivamente). Lo que esto significa es que puede anotar sus clases de componente con @Component, pero al anotarlas con @Repository, @Service o @Controller, sus clases son más adecuadas para el procesamiento por herramientas o la asociación con aspectos. Por ejemplo, estas anotaciones de estereotipo son objetivos ideales para los puntos de corte. Por supuesto, también es posible que @Repository, @Service y @Controller puedan llevar una semántica adicional en futuras versiones de Spring Framework. Por lo tanto, si toma una decisión entre utilizar @Component o @Service para su capa de servicio, @Service es claramente la mejor opción. Del mismo modo, como se indicó anteriormente, @Repository ya es compatible como un marcador para la traducción automática de excepciones en su capa de persistencia.

@Component – Indicates a auto scan component.
@Repository – Indicates DAO component in the persistence layer.
@Service – Indicates a Service component in the business layer.
@Controller – Indicates a controller component in the presentation layer.

referencia: - Documentación de Spring: escaneo Classpath, componentes administrados y configuraciones de escritura usando Java  


59
2018-05-15 12:48



@Component – Indicates a auto scan component.  
@Repository – Indicates DAO component in the persistence layer.  
@Service – Indicates a Service component in the business layer.   
@Controller – Indicates a controller component in the presentation layer.  

Notarás que todo @Repository,@Service o @Controller están anotados con @Component. Entonces, ¿podemos usar solo @Component para todos los componentes para escaneo automático? Sí, puede, y Spring escaneará automáticamente todos sus componentes con @Component anotado.

Está funcionando bien, pero no es una buena práctica para la legibilidad, siempre debes declarar @Repository,@Service o @Controller para una capa específica para hacer que su código sea más fácil de leer.


51
2017-12-16 18:10



Uso de @Service y @Repository las anotaciones son importantes desde la perspectiva de conexión de la base de datos.

  1. Utilizar @Service para todo su tipo de servicio web de conexiones DB
  2. Utilizar @Repository para todas sus conexiones de base de datos proc almacenadas

Si no utiliza las anotaciones adecuadas, puede enfrentar excepciones de compromiso anuladas mediante transacciones de reversión. Verás excepciones durante la prueba de carga de estrés que está relacionada con la reversión de las transacciones JDBC.


40
2017-11-02 16:05