¿Pueden @Component
, @Repository
y las @Service
anotaciones se pueden usar 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?
java
spring
spring-mvc
annotations
Colin McCree
fuente
fuente
Respuestas:
De la documentación de primavera :
fuente
@Service
es un@Component
(porque la@Service
anotación misma está anotada con@Component
). Hasta donde yo sé, nada en el marco de Spring explícitamente hace uso del hecho de que algo es un@Service
, por lo que la diferencia es realmente solo conceptual.Como muchas de las respuestas ya indican para qué se usan estas anotaciones, aquí nos centraremos en algunas diferencias menores entre ellas.
Diferencias entre @Component, @Repository, @Controller y @Service
Esta es una anotación de estereotipo de propósito general que indica que la clase es un componente de resorte.
Lo que es especial acerca de @Component
<context:component-scan>
solo escanea@Component
y no busca@Controller
,@Service
y@Repository
en general. Se escanean porque ellos mismos están anotados con@Component
.Basta con echar un vistazo a
@Controller
,@Service
y@Repository
las definiciones de anotación:Por lo tanto, no está mal decir eso
@Controller
,@Service
y@Repository
son tipos especiales de@Component
anotación.<context:component-scan>
los recoge y registra sus siguientes clases como beans, como si estuvieran anotados con@Component
.Las anotaciones de tipo especial también se escanean, porque ellas mismas están anotadas con
@Component
anotaciones, lo que significa que también son@Component
s. Si definimos nuestra propia anotación personalizada y la anotamos@Component
, también se escaneará con<context:component-scan>
Esto es para indicar que la clase define un repositorio de datos.
¿Qué tiene de especial @Repository?
Además de señalar que esta es una configuración basada en anotaciones ,
@Repository
el trabajo es capturar excepciones específicas de la plataforma y volver a lanzarlas como una de las excepciones unificadas y no verificadas de Spring. Para esto, se nos proporcionaPersistenceExceptionTranslationPostProcessor
que debemos agregar en el contexto de nuestra aplicación Spring de esta manera:Este postprocesador de beans agrega un asesor a cualquier bean anotado
@Repository
para que se capturen las excepciones específicas de la plataforma y luego se vuelvan a generar como una de las excepciones de acceso a datos no verificadas de Spring.La
@Controller
anotación indica que una clase particular cumple la función de un controlador. La@Controller
anotación actúa como un estereotipo para la clase anotada, indicando su papel.¿Qué tiene de especial @Controller?
No podemos cambiar esta anotación con ninguna otra similar
@Service
o@Repository
, aunque parezcan iguales. El despachador escanea las clases anotadas@Controller
y detecta métodos anotados con@RequestMapping
anotaciones dentro de ellas. Podemos utilizar@RequestMapping
sobre / en sólo aquellos métodos cuyas clases están anotados con@Controller
y será NO trabajar con@Component
,@Service
,@Repository
etc ...Nota: Si una clase ya está registrado como un bean a través de cualquier método alternativo, al igual que a través
@Bean
o por medio de@Component
,@Service
etc ... anotaciones, a continuación,@RequestMapping
se pueden tomar si la clase también se anota con@RequestMapping
anotación. Pero ese es un escenario diferente.@Service
los beans contienen la lógica de negocios y los métodos de llamada en la capa del repositorio.¿Qué tiene de especial @Service?
Aparte del hecho de que se usa para indicar, que mantiene la lógica de negocios, no hay nada más notable en esta anotación; pero quién sabe, Spring puede agregar algunos excepcionales adicionales en el futuro.
Similar a lo anterior, en el futuro Spring puede agregar funcionalidades especiales para
@Service
,@Controller
y en@Repository
base a sus convenciones de capas. Por lo tanto, siempre es una buena idea respetar la convención y usarla en línea con las capas.fuente
@Controller
anotación. No es necesario si la clase se anota con@RequestMapping
y se crea bean de esta clase de alguna manera. Cualquier bean anotado con@Controller
OR@RequestMapping
participará en las asignaciones de solicitud de Spring MVC. Esto puede ser útil, por ejemplo, para crear controladores mediante programación (por ejemplo, utilizando@Bean
métodos) y al mismo tiempo para evitar que Spring intente crearlos mediante el escaneo de paquetes (si el paquete no puede excluirse del escaneo).Son casi iguales, todos significan que la clase es un grano de primavera.
@Service
,@Repository
y@Controller
están especializados@Component
s. Puede elegir realizar acciones específicas con ellos. Por ejemplo:@Controller
frijoles son utilizados por spring-mvc@Repository
los beans son elegibles para la traducción de excepción de persistenciaOtra cosa es que designe los componentes semánticamente a diferentes capas.
Una cosa que
@Component
ofrece es que puede anotar otras anotaciones con él y luego usarlas de la misma manera que@Service
.Por ejemplo, recientemente hice:
Por lo tanto, todas las clases anotadas
@ScheduledJob
son frijoles de primavera y, además, están registradas como trabajos de cuarzo. Solo tiene que proporcionar un código que maneje la anotación específica.fuente
@Component es equivalente a
@Service, @Controller, @Repository = {@Component + alguna funcionalidad más especial}
Eso significa que el Servicio, el Controlador y el Repositorio son funcionalmente iguales.
Las tres anotaciones se utilizan para separar "Capas" en su aplicación,
Ahora puede preguntar por qué separarlos: (supongo que conoce la programación orientada a aspectos AOP)
Supongamos que solo desea supervisar la actividad de la capa DAO. Escribirás una clase de Aspecto (clase A) que hace un registro antes y después de que se invoque cada método de tu DAO, puedes hacerlo usando AOP ya que tienes tres capas distintas y no están mezcladas.
Por lo tanto, puede hacer un registro de DAO "alrededor", "antes" o "después" de los métodos DAO. Podrías hacerlo porque tenías un DAO en primer lugar. Lo que acaba de lograr es la separación de preocupaciones o tareas.
Imagínese si solo hubiera una anotación en @Controller, entonces este componente tendrá despacho, lógica de negocios y acceso a la base de datos, ¡todo un código tan sucio!
Lo anterior es un escenario muy común, hay muchos más casos de uso de por qué usar tres anotaciones.
fuente
@Respository
también tiene la función de traducción automática de excepciones. Al igual que cuando ocurre una excepción en un,@Repository
generalmente hay un controlador para esa excepción y no es necesario agregar bloques try catch en la clase DAO. Se usa junto con PersistenceExceptionTranslationPostProcessorEn primavera
@Component
,@Service
,@Controller
, y@Repository
son anotaciones estereotipo que se utilizan para:@Controller:
donde la asignación de su solicitud desde la página de presentación finaliza, es decir, la capa de presentación no irá a ningún otro archivo, va directamente a la@Controller
clase y comprueba la ruta solicitada en@RequestMapping
anotación que se escribe antes de las llamadas al método si es necesario.@Service
: Toda la lógica empresarial está aquí, es decir, 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, por lo que llamará a este método utilizando esta anotación. Solicitará @Repository según la solicitud del usuario@Repository
: Esta es la capa de persistencia (Data Access Layer) 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.fuente
referencia: - Spring Documentation - Escaneo de classpath, componentes administrados y configuraciones de escritura usando Java
fuente
Técnicamente
@Controller
,@Service
,@Repository
son todos iguales. Todos ellos se extienden@Component
.Del código fuente de Spring:
Indica que una clase anotada es un "componente". Dichas clases se consideran candidatos para la detección automática cuando se utiliza la configuración basada en anotaciones y el escaneo de classpath.
Podemos utilizar directamente
@Component
para todas y cada grano, pero para una mejor comprensión y capacidad de mantenimiento de una aplicación grande, utilizamos@Controller
,@Service
,@Repository
.Propósito de cada anotación:
@Controller
-> Las clases anotadas con esto, están destinadas a recibir una solicitud del lado del cliente. La primera solicitud llega al Servlet Dispatcher, desde donde pasa la solicitud al controlador en particular utilizando el valor de@RequestMapping
anotación.@Service
-> Las clases anotadas con esto, están destinadas a manipular los datos que recibimos del cliente o que obtenemos de la base de datos. Toda la manipulación con datos debe hacerse en esta capa.@Repository
-> Las clases anotadas con esto, están destinadas a conectarse con la base de datos. También se puede considerar como capa DAO (objeto de acceso a datos). Esta capa debe restringirse únicamente a operaciones CRUD (crear, recuperar, actualizar, eliminar). Si se requiere alguna manipulación, los datos deben enviarse y devolverse a la capa @Service.Si intercambiamos su lugar (uso
@Repository
en lugar de@Controller
), nuestra aplicación funcionará bien.El propósito principal de usar tres diferentes
@annotations
es proporcionar una mejor Modularidad a la aplicación Enterprise.fuente
controller and repository
El uso
@Service
y las@Repository
anotaciones son importantes desde la perspectiva de la conexión de la base de datos.@Service
para todo su tipo de servicio web de conexiones de base de datos@Repository
para todas sus conexiones de DB de proceso almacenadasSi no utiliza las anotaciones adecuadas, puede enfrentar excepciones de confirmación anuladas por transacciones de reversión. Verá excepciones durante la prueba de carga de esfuerzo que está relacionada con las transacciones JDBC de reversión.
fuente
@Repository
está específicamente diseñado para trabajar con capa de persistencia. Si está trabajando con la API de descanso, está trabajando con DTO, no con DAO.@Repository @Service y @Controller sirven como especialización de @Component para un uso más específico sobre la base de que puede reemplazar @Service a @Component pero en este caso pierde la especialización.
fuente
todas estas anotaciones son de tipo estéreo de tipo de anotación, la diferencia entre estas tres anotaciones es
por ejemplo
@Service
or@Repositroy
o@Controller
por defecto, la@Component
anotación va a existir en la parte superior de la clasefuente
Primavera ofrece cuatro tipos diferentes de anotaciones de escaneo de componentes de automóviles, que son
@Component
,@Service
,@Repository
y@Controller
. Técnicamente, no hay diferencia entre ellos, pero cada anotación de escaneo de componentes automáticos debe usarse para un propósito especial y dentro de la capa definida.@Component
: Es una anotación básica de escaneo de componentes automáticos, indica que la clase anotada es un componente de escaneo automático.@Controller
: La clase anotada indica que es un componente controlador y se usa principalmente en la capa de presentación.@Service
: Indica que la clase anotada es un componente de Servicio en la capa empresarial.@Repository
: Debe usar esta anotación dentro de la capa de persistencia, esto actúa como repositorio de base de datos.Uno debe elegir una forma más especializada de
@Component
anotar su clase, ya que esta anotación puede contener un comportamiento específico en el futuro.fuente
Podemos responder esto de acuerdo con el estándar de Java
En referencia a
JSR-330
, que ahora es compatible con spring, solo puede usar@Named
para definir un bean (de alguna manera@Named=@Component
). Así que de acuerdo a esta norma, parece que no hay empleo para definir estereotipos (como@Repository
,@Service
,@Controller
) en las categorías judías.Pero el usuario de Spring estas diferentes anotaciones en diferentes para el uso específico, por ejemplo:
aspect-oriented
, estos pueden ser un buen candidato parapointcuts
)@Repository
la anotación agregará alguna funcionalidad a su bean (alguna traducción de excepción automática a su capa de persistencia de bean).@RequestMapping
solo se puede agregar a las clases que están anotadas por@Controller
.fuente
Anote otros componentes con @Component, por ejemplo, clases de recursos REST.
@Component es un estereotipo genérico para cualquier componente administrado por Spring.
@Controller, @Service y @Repository son especializaciones de @Component para casos de uso específicos.
@Componente en primavera
fuente
No hay ninguna diferencia entre
@Component
,@Service
,@Controller
,@Repository
.@Component
es la anotación genérica para representar el componente de nuestro MVC. Pero habrá varios componentes como parte de nuestra aplicación MVC, como componentes de la capa de servicio, componentes de la capa de persistencia y componentes de la capa de presentación. Entonces, para diferenciarlos, la gente de Spring también ha dado las otras tres anotaciones.@Repository
@Service
@Controller
@Component
para todos ellos.fuente
Incluso si intercambiamos @Component o @Repository o @service
Se comportará igual, pero un aspecto es que no podrán detectar alguna excepción específica relacionada con DAO en lugar de Repository si usamos componente o servicio @
fuente
En Spring 4, última versión:
fuente
@Componente : anota una clase
@Component
, le dice a Hibernate que es un Bean.@Repository : anota una clase
@Repository
, le dice a Hibernate que es una clase DAO y la trata como una clase DAO. Significa que las excepciones no marcadas (lanzadas desde los métodos DAO) son elegibles para la traducción a SpringDataAccessException
.@Service : Esto le dice a Hibernate que es una clase de Servicio donde tendrá
@Transactional
etc. Anotaciones de la capa de Servicio, por lo que hibernate lo trata como un componente del Servicio.Además
@Service
es avance de@Component
. Suponga que el nombre de la clase del bean esCustomerService
, ya que no eligió la forma de configuración del bean XML, por lo que anotó el bean con el@Component
fin de indicarlo como un Bean. Entonces, al obtener el objeto beanCustomerService cust = (CustomerService)context.getBean("customerService");
Por defecto, Spring minúscula el primer carácter del componente, desde 'CustomerService' hasta 'customerService'. Y puede recuperar este componente con el nombre 'customerService'. Pero si usa una@Service
anotación para la clase de bean, puede proporcionar un nombre de bean específicoy puedes obtener el objeto bean por
fuente
@Component
es la anotación genérica de nivel superior que hace que el bean anotado se escanee y esté disponible en el contenedor DI@Repository
es una anotación especializada y trae la característica de convertir todas las excepciones no verificadas de las clases DAO@Service
Es una anotación especializada. no trae ninguna característica nueva a partir de ahora pero aclara la intención del bean@Controller es una anotación especializada que hace que el bean MVC sea consciente y permite el uso de otras anotaciones similares
@RequestMapping
y todas esasAquí hay más detalles
fuente
A
@Service
para citar la documentación de primavera,Si nos fijamos en el diseño impulsado por dominio de Eric Evans,
y
Repository
según Eric Evans,fuente
Las respuestas lo suficientemente buenas están aquí para explicar las anotaciones de cuál es la diferencia entre los componentes del servicio de repositorio de componentes. Me gustaría compartir la diferencia entre
@Controller & @RestController
@Controller
vsRestController
@RestController
:@Controller
cual agrega@Controller
y@ResponseBody
anota automáticamente. así que no tenemos que agregar@ResponseBody
a nuestros métodos de mapeo. Eso significa que@ResponseBody
está activo por defecto.@RestController
no puede devolver una vista (Al usarViewresolver
en Spring / Spring-Boot)@RestController
también convierte la respuesta aJSON/XML automatically
como@ResponseBody
hace que los objetos devueltos se conviertan en algo que podría estar en el cuerpo,e.g. JSON or XML
@Controller
@Controller
se usa para marcar clases como Spring MVC Controller. Esta anotación es solo una versión especializada@Component
y permite que las clases de controlador se detecten automáticamente en función del escaneo de classpath.@Controller
puede devolver una vista en Spring web MVC.Vista mas detallada
fuente
El repositorio y el servicio son elementos secundarios de la anotación de componentes . Entonces, todos ellos son Componente . El repositorio y el servicio solo lo expanden. ¿Cómo exactamente? El servicio solo tiene una diferencia ideológica: lo usamos para servicios. El repositorio tiene un controlador de excepciones particular.
fuente
Explicación de los estereotipos:
@Service
- Anote todas sus clases de servicio con @Service. Esta capa conoce la unidad de trabajo. Toda su lógica de negocios estará en clases de servicio. En general, los métodos de la capa de servicio están cubiertos por la transacción. Puede realizar múltiples llamadas DAO desde el método de servicio, si una transacción falla, todas las transacciones deberían revertirse.@Repository
- Anote todas sus clases de DAO con @Repository. Toda la lógica de acceso a su base de datos debe estar en clases DAO.@Component
- Anote sus otros componentes (por ejemplo, clases de recursos REST) con estereotipo de componente.@Autowired
- Deje que Spring conecte automáticamente otros beans a sus clases usando la anotación @Autowired.@Component
es un estereotipo genérico para cualquier componente administrado por Spring.@Repository
,@Service
y@Controller
son especializaciones de@Component
casos de uso más específicos, por ejemplo, en las capas de persistencia, servicio y presentación, respectivamente.Originalmente respondido aquí .
fuente
Diferencia entre las anotaciones @Component, @Repository, @Controller y @Service
@Controller
= @Component (Anotación interna) + Características de la capa de presentación@Service
= @Component (Anotación interna) + Características de la capa de servicio@Component
= Componentes reales (Frijoles)@Repository
= @Component (Anotación interna) + Características de la capa de datos (uso para manejar los Frijoles de dominio)fuente
En Spring Framework proporciona algún tipo especial de anotaciones, llamadas anotaciones de estereotipo. Estos son los siguientes:
las anotaciones declaradas anteriormente son especiales porque cuando agregamos
<context:component-scan>
al archivo xxx-servlet.xml, spring creará automáticamente el objeto de esas clases que se anotan con la anotación anterior durante la fase de creación / carga de contexto.fuente
@Component
`@ Repository
`@ Service
`@Controller
`@Component
es un estereotipo genérico para los componentes administrados por la primavera@Repository
,@Service
y@Controller
son@Component
especializaciones para más usos específicos:@Repository
por persistencia@Service
para servicios y transacciones@Controller
para controladores MVC¿Por qué utilizar
@Repository
,@Service
,@Controller
sobre@Component
? Podemos marcar nuestras clases de componentes con @Component, pero si en su lugar usamos la alternativa que se adapta a la funcionalidad esperada. Nuestras clases se adaptan mejor a la funcionalidad esperada en cada caso particular.Una clase anotada con
@Repository
tiene una mejor traducción y manejo legible de errores con org.springframework.dao.DataAccessException. Ideal para implementar componentes que acceden a datos (DataAccessObject o DAO).Una clase anotada con
@Controller
juega un papel de controlador en una aplicación Spring Web MVCUna clase anotada con
@Service
juega un papel en los servicios de lógica de negocios, por ejemplo, el patrón Facade para DAO Manager (Facade) y el manejo de transaccionesfuente
Las respuestas presentadas aquí son en gran medida técnicamente correctas, pero a pesar de que la lista de respuestas es larga y esto estará en la parte inferior, pensé que valía la pena poner una respuesta realmente correcta aquí también, en caso de que alguien se tope y aprenda algo valioso de eso. No es que el resto de las respuestas estén equivocadas, es solo que no están correctas. Y, para detener a las hordas de trolls, sí, sé que técnicamente estas anotaciones son efectivamente lo mismo y más intercambiables incluso hasta la primavera 5. Ahora, para la respuesta correcta:
Estas tres anotaciones son cosas completamente diferentes y no son intercambiables. Puedes decir eso porque hay tres en lugar de solo uno. No están destinados a ser intercambiables, solo se implementan de esa manera por elegancia y conveniencia.
La programación moderna es invención, arte, técnica y comunicación, en proporciones variables. El bit de comunicación suele ser muy importante porque el código se lee con mucha más frecuencia de lo que se escribe. Como programador, no solo está tratando de resolver el problema técnico, sino que también está tratando de comunicar su intención a los futuros programadores que leen su código. Es posible que estos programadores no compartan su idioma nativo, ni su entorno social, y es posible que estén leyendo su código dentro de 50 años (no es tan improbable como podría pensar). Es difícil comunicarse efectivamente tan lejos en el futuro. Por lo tanto, es vital que usemos el lenguaje más claro, más eficiente, correcto y comunicativo disponible para nosotros.
Por ejemplo, es vital que
@Repository
se use cuando escribimos un repositorio, en lugar de hacerlo@Component
. Esta última es una elección de anotación muy pobre para un repositorio porque no indica que estamos viendo un repositorio. Podemos suponer que un repositorio es también un spring-bean, pero no que un componente sea un repositorio. Con@Repository
nosotros estamos siendo claros y específicos en nuestro idioma. Estamos afirmando claramente que este es un repositorio. Con@Component
dejamos que el lector decida qué tipo de componente están leyendo, y tendrán que leer toda la clase (y posiblemente un árbol de subclases e interfaces) para inferir el significado. La clase podría ser malinterpretada por un lector en un futuro lejano como no un repositorio, y habríamos sido parcialmente responsables de este error porque nosotros, que sabíamos muy bien que se trata de un repositorio, no fuimos específicos en nuestro idioma y comunicar efectivamente nuestra intención.No entraré en los otros ejemplos, pero declararé lo más claramente posible: estas anotaciones son cosas completamente diferentes y deben usarse de manera apropiada, según su intención.
@Repository
es para repositorios de almacenamiento y ninguna otra anotación es correcta.@Service
es para servicios y ninguna otra anotación es correcta.@Component
es para componentes que no son repositorios ni servicios, y usar cualquiera de estos en su lugar también sería incorrecto. Podría compilarse, incluso podría ejecutarse y pasar sus pruebas, pero estaría mal y pensaría menos de usted (profesionalmente) si hiciera esto.Hay ejemplos de esto durante la primavera (y la programación en general). No debe usarlo
@Controller
al escribir una API REST, porque@RestController
está disponible. No debe usar@RequestMapping
cuando@GetMapping
es una alternativa válida. Etc. Etc. Etc. Debe elegir el lenguaje exacto y correcto más específico posible para comunicar su intención a sus lectores, de lo contrario, está introduciendo riesgos en su sistema, y el riesgo tiene un costo.fuente
Para simplificar esta ilustración, consideremos el tecnicismo por caso de uso. Estas anotaciones se usan para inyectarse y, como dije literalmente " Solía inyectarse ", es decir, si sabe cómo usar la inyección de dependencia "DI" y usted debería, entonces siempre buscará estas anotaciones, y al anotar las clases con estos tipos estéreo , está informando al contenedor DI para escanearlos para que estén listos para la inyección en otros lugares, este es el objetivo práctico.
Ahora pasemos a cada uno; primero @Service , si está creando algo de lógica para un caso de negocios específico, necesita separarlo en un lugar que contendrá su lógica de negocios, este servicio es de Clase normal o puede usarlo como interfaz si lo desea, y está escrito como esta
Todos son de la misma manera cuando los inyecta, @Repository es una interfaz que aplica la implementación para el patrón de diseño de Repository Pattern Repository , generalmente se usa cuando se trata de algún almacén de datos o base de datos, y encontrará que contiene múltiples implementación lista para que usted maneje las operaciones de la base de datos; puede ser CrudRepository , JpaRepository , etc.
Finalmente , @Component , esta es la forma genérica para los beans registrados en Spring, esa primavera siempre está buscando frijoles marcados con @Component para registrarse, luego @Service y @Repository son casos especiales de @Component, sin embargo, el caso de uso común ¡el componente es cuando estás haciendo algo puramente técnico, no para cubrir el caso comercial directo! como formatear fechas o entregar mecanismos de serialización de solicitudes especiales, etc.
fuente
@Component actúa como anotación @Bean en la clase de configuración, registre bean en contexto de primavera. También es padre para la anotación @Service, @Repository y @Controller.
@Service , extiende la anotación @Component y solo tiene una diferencia de nomenclatura.
@Repository : extiende la anotación @Component y traduce todas las excepciones de la base de datos a DataAccessException .
@Controller : actúa como controlador en el patrón MVC. El despachador escaneará dichas clases anotadas para métodos mapeados, detectando anotaciones @RequestMapping.
fuente
Estas son todas las anotaciones StereoType. Estas son útiles para hacer nuestras clases como frijoles de primavera en el contenedor ioc,
fuente