¿La anotación de primavera @ Controller es lo mismo que @Service?


¿Es la anotación de primavera @Controller lo mismo que @Service?

Tengo una idea sobre @Controller que se puede usar para URL mapear e invocar lógica de negocio.

Mientras que @Service se usa para anotar la clase de servicio que contiene lógica de negocio.

¿Puedo usar @Controller en lugar de @Service para anotar la clase de servicio?

Author: subodh, 2013-04-10

6 answers

No, son bastante diferentes entre sí.

Ambas son especializaciones diferentes de@Component anotación (en la práctica, son dos implementaciones diferentes de la misma interfaz) por lo que ambas pueden ser descubiertas por el escaneo de classpath (si lo declara en su configuración XML)

@Service la anotación se usa en su capa de servicio y anota las clases que realizan tareas de servicio, a menudo no la usa, pero en muchos casos usa esta anotación para representan una mejor práctica. Por ejemplo, puede llamar directamente a una clase DAO para que persista un objeto en su base de datos, pero esto es horrible. Es bastante bueno llamar a una clase de servicio que llama a un DAO. Esto es una buena cosa para realizar el patrón de separación de preocupaciones.

@Controller anotación es una anotación utilizada en Spring MVC framework (el componente de Spring Framework utilizado para implementar Aplicaciones Web). La anotación @ Controller indica que una clase particular sirve papel de un controlador. La anotación @ Controller actúa como un estereotipo para la clase anotada, indicando su rol. El despachador escanea dichas clases anotadas en busca de métodos asignados y detecta las anotaciones @RequestMapping.

Así que mirando la arquitectura MVC de Spring, tiene una clase DispatcherServlet (que declara en su configuración XML) que representa un controlador frontal que envía toda la solicitud HTTP hacia las clases de controlador apropiadas (anotadas por @Controller). Este class realiza la lógica de negocio (y puede llamar a los servicios) por su método. Estas clases (o sus métodos) normalmente se anotan también con @RequestMapping anotación que especifica qué petición HTTP es manejada por el controlador y por su método.

Por ejemplo:

@Controller
@RequestMapping("/appointments")
public class AppointmentsController {

    private final AppointmentBook appointmentBook;

    @Autowired
    public AppointmentsController(AppointmentBook appointmentBook) {
        this.appointmentBook = appointmentBook;
    }

    @RequestMapping(method = RequestMethod.GET)
    public Map<String, Appointment> get() {
        return appointmentBook.getAppointmentsForToday();
    }

Esta clase es un controlador.

Esta clase maneja toda la solicitud HTTP hacia" / appointments ""folder" y, en particular, el método get es el método llamado para manejar toda la solicitud GET HTTP hacia la carpeta "/ appointments".

Espero que ahora sea más claro para ti.

 88
Author: AndreaNobili,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-02-05 23:40:11

Si nos fijamos en las definiciones de @Controller, @Service anotaciones, entonces usted encontrará que estos son un tipo especial de @Component anotación.

@Component
public @interface Service {
    ….
}

 

@Component
public @interface Controller {
    …
}

Entonces, ¿cuál es la diferencia?

@Controlador

La anotación @Controller indica que una clase particular sirve el papel de un controlador. La anotación @Controller actúa como un estereotipo para la clase anotada, indicando su rol.

¿Qué tiene de especial @Controller?

No puede cambiar esta anotación con cualquier otra como @Service o @Repository, aunque se vean iguales. El despachador escanea las clases anotadas con @Controller y detecta @RequestMapping anotaciones dentro de ellas. Solo puede usar @RequestMapping en @Controller clases anotadas.


@Servicio

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

¿Qué tiene de especial @Service?

Aparte del hecho de que se utiliza para indicar que está sosteniendo la lógica de negocios, no hay una especialidad notable que esta anotación proporciona, pero quién sabe, la primavera puede agregar algunos excepcionales adicionales en el futuro.

Respuesta vinculada: ¿Cuál es la diferencia entre las anotaciones @Component, @Repository y @Service en primavera?

 23
Author: Raman Sahasi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-05-22 03:59:22

No, @Controller no es lo mismo que @Service, aunque ambos son especializaciones de @Component, por lo que ambos son candidatos para el descubrimiento por escaneo de ruta de clase. La anotación @Service se utiliza en la capa de servicio, y @Controller es para los controladores MVC de primavera en la capa de presentación. Un @Controller normalmente tendría una asignación de URL y se activaría mediante una solicitud web.

 7
Author: NilsH,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-04-10 10:21:00

@ Servicio vs @ Controlador

@Service : la clase es una "Fachada de Servicio Empresarial" (en el sentido de patrones J2EE), o algo similar.

@Controller : Indica que una clase anotada es un "Controlador" (por ejemplo, un controlador web).

----------Encuentre notas útiles sobre los Principales Estereotipos http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/stereotype/Component.html

@ componente de interfaz

  @Target(value=TYPE)
     @Retention(value=RUNTIME)
     @Documented
    public @interface Component

Indica que un la clase anotada es un componente. Estas clases se consideran candidatas para la detección automática cuando se utiliza la configuración basada en anotaciones y el análisis de ruta de clase.

Otras anotaciones a nivel de clase también pueden considerarse como identificando un componente, típicamente un tipo especial de componente: por ejemplo, la anotación @Repository o la anotación @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, una web controlador).

Esta anotación sirve como una especialización de @Component, permitiendo que las clases de implementación se detecten automáticamente a través del escaneo de rutas de clase. Normalmente 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", definido originalmente por Domain-Driven Design (Evans, 2003) como " una operación ofrecida como una interfaz que se encuentra solo en el modelo, sin estado encapsulado." También puede indicar que una clase es una "Fachada de Servicio de Negocio" (en el sentido de patrones J2EE Core), o algo similar. Esta anotación es un estereotipo de propósito general y los equipos individuales pueden limitar su semántica y usarla según corresponda.

Esta anotación sirve como una especialización de @Component, permitiendo que las clases de implementación se detecten automáticamente a través del escaneo de rutas de clase.

@interfaz Repositorio

@Target(value=TYPE)
 @Retention(value=RUNTIME)
 @Documented
 @Component
public @interface Repository

Indica que una clase anotada es un "Repositorio", definido originalmente 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 para comprender la distinción entre Objeto 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 la primavera 2.5, esta anotación también sirve como una especialización de @Component, que permite que las clases de implementación se detecten automáticamente a través del escaneo classpath.

 3
Author: Kanthishere,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-07-03 06:51:39

Ya respondí una pregunta similar aquí Aquí está el Enlace

No ambos son diferentes.

La anotación @ Service se usa para otro propósito y el uso @Controller para otro. En realidad, las anotaciones de Spring @Component, @Service, @Repository y @Controller se utilizan para la detección automática de frijol usando classpath scan en Spring framework, pero no, significa que todas las funcionalidades son iguales. @Service: Indica que la clase anotada es un componente de servicio en el negocio estrato.

@Controller: La clase anotada indica que es un componente del controlador, y se utiliza principalmente en la capa de presentación.

 1
Author: Yasir Shabbir Choudhary,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 11:47:16

No, no puedes, son diferentes. Cuando se implementó la aplicación, las asignaciones de controladores se borked, por ejemplo.

¿Por qué lo desea de todos modos, un controlador es no un servicio, y viceversa.

 0
Author: NimChimpsky,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-04-10 10:17:58