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

80

¿Es la anotación Spring lo @Controllermismo que@Service ?

Tengo idea de @Controllercuál se puede usar paraURL mapear e invocar la lógica empresarial.

mientras @Service usa para anotar la clase de servicio que contiene lógica empresarial.

¿Puedo usar en @Controllerlugar de @Serviceanotar la clase de servicio?

Ketan
fuente

Respuestas:

124

No, son bastante diferentes entre sí.

Ambas son especializaciones diferentes de la anotación @Component (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 declaras en tu configuración XML)

La anotación @Service se usa en su capa de servicio y anota clases que realizan tareas de servicio, a menudo no la usa, pero en muchos casos usa esta anotación para representar una mejor práctica. Por ejemplo, podría llamar directamente a una clase DAO para conservar 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 bueno para realizar el patrón de separación de preocupaciones.

La anotación @Controller es una anotación utilizada en el marco Spring MVC (el componente de Spring Framework que se usa para implementar la aplicación web). La anotación @Controller indica que una clase en particular cumple la función de controlador. La anotación @Controller actúa como un estereotipo para la clase anotada, indicando su función. El despachador escanea dichas clases anotadas en busca de métodos mapeados y detecta anotaciones @RequestMapping.

Entonces, mirando la arquitectura Spring MVC, 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 (anotado por @Controller). Esta clase realiza la lógica empresarial (y puede llamar a los servicios) mediante su método. Estas clases (o sus métodos) generalmente también se anotan con la anotación @RequestMapping que especifica qué solicitud HTTP maneja el controlador y 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 todas las Solicitudes HTTP hacia la carpeta "/ citas" "carpeta" y en particular el método get es el método llamado para manejar todas las Solicitudes HTTP GET hacia la carpeta "/ citas".

Espero que ahora te quede más claro.

AndreaNobili
fuente
3
Muy bonita explicación. Un punto a mencionar, las clases de controlador (at) no necesitan tener (at) RequestMapping, (at) RequestMapping también puede ser a nivel de método.
cronometrador
1
¿Puedo mezclarlos en una definición de clase única? ¿O es mejor implementarlos como clases separadas?
kensai
37

Si nos fijamos en las definiciones de @Controller, @Serviceanotaciones, a continuación, encontrará que estos son tipo especial de @Componentanotación.

@Component
public @interface Service {
    ….
}

 

@Component
public @interface Controller {
    …
}

Entonces, ¿cuál es la diferencia?

@Controlador

La @Controlleranotación indica que una clase en particular cumple la función de controlador. La @Controlleranotación actúa como un estereotipo para la clase anotada, indicando su función.

¿Qué tiene de especial @Controller?

No puede cambiar esta anotación con ningún otro similar @Serviceo @Repository, aunque tengan el mismo aspecto. El despachador escanea las clases con anotaciones @Controllery detecta @RequestMappinganotaciones dentro de ellas. Solo puede usar @RequestMappingen @Controllerclases anotadas.


@Servicio

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

¿Qué tiene de especial @Service?

Aparte del hecho de que se utiliza para indicar que mantiene la lógica empresarial, no hay una especialidad notable que proporcione esta anotación, pero quién sabe, la primavera puede agregar algo excepcional adicional en el futuro.

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

Raman Sahasi
fuente
7

No, @Controllerno es lo mismo que @Service, aunque ambos son especializaciones de @Component, lo que los convierte en candidatos para el descubrimiento mediante escaneo de rutas de clases. La @Serviceanotación se usa en su capa de servicio y @Controlleres para los controladores Spring MVC en su capa de presentación. A @Controllernormalmente tendría una asignación de URL y se activará mediante una solicitud web.

NilsH
fuente
5

@Servicio vs @Controller

@Service: class es una "Fachada de servicios empresariales" (en el sentido de los patrones Core J2EE) o algo similar.

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

---------- Encuentra notas útiles sobre los principales estereotipos http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/stereotype/Component.html

@interface Componente

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

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

También se pueden considerar otras anotaciones a nivel de clase como identificación de un componente, normalmente un tipo especial de componente: por ejemplo, la anotación @Repository o la anotación @Aspect de 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, un controlador web).

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

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

@interface Repositorio

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

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

Kanthishere
fuente
1

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

No, ambos son diferentes.

La anotación @Service tiene uso para otros fines y el uso de @Controller para otros. En realidad, las anotaciones Spring @Component, @Service, @Repository y @Controller se utilizan para la detección automática de beans mediante el escaneo de classpath en el marco de Spring, pero no significa que todas las funcionalidades son iguales. @Service: indica que la clase anotada es un componente de servicio en la capa empresarial.

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

Yasir Shabbir Choudhary
fuente
0

No, no puedes, son diferentes. Cuando se implementó la aplicación, las asignaciones de su controlador se eliminarían, por ejemplo.

De todos modos, ¿por qué quieres hacerlo? Un controlador no es un servicio y viceversa.

NimChimpsky
fuente
0

De primavera en acción

Como puede ver, esta clase está anotada con @Controller. Por sí solo, @Controller no hace mucho. Su propósito principal es identificar esta clase como un componente para el análisis de componentes. Debido a que HomeController está anotado con @Controller, el escaneo de componentes de Spring lo descubre automáticamente y crea una instancia de HomeController como un bean en el contexto de la aplicación Spring.

De hecho, un puñado de otras anotaciones (incluidas @Component, @Service y @Repository) tienen un propósito similar al de @Controller. Podría haber anotado HomeController con la misma eficacia con cualquiera de esas otras anotaciones, y aún así habría funcionado igual. Sin embargo, la elección de @Controller es más descriptiva de la función de este componente en la aplicación.

porque
fuente
0

Puede declarar un @service como @Controller .

NO puede declarar un @Controller como @Service

@Servicio

Es regular. Solo está declarando la clase como un componente.

@Controlador

Es un poco más especial que Component. El despachador buscará @RequestMapping aquí. Por lo tanto, una clase anotada con @Controller también tendrá la capacidad de declarar las URL a través de las cuales se llaman las API

Aditya Rewari
fuente
0
  • El controlador manejará la navegación entre las diferentes vistas. Sus asignaciones de solicitud de asignaciones se manejan con la ayuda del controlador.
  • El servicio interactúa directamente con el repositorio donde normalmente se realiza la lógica empresarial. Puede agregar, eliminar, eliminar, etc. en la capa de servicio
Zishan Khan
fuente