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.
Si nos fijamos en las definiciones de
@Controller
,@Service
anotaciones, a continuación, encontrará que estos son tipo especial de@Component
anotación.@Component public @interface Service { …. }
@Component public @interface Controller { … }
Entonces, ¿cuál es la diferencia?
La
@Controller
anotación indica que una clase en particular cumple la función de controlador. La@Controller
anotació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
@Service
o@Repository
, aunque tengan el mismo aspecto. El despachador escanea las clases con anotaciones@Controller
y detecta@RequestMapping
anotaciones dentro de ellas. Solo puede usar@RequestMapping
en@Controller
clases anotadas.@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?
fuente
No,
@Controller
no 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@Service
anotación se usa en su capa de servicio y@Controller
es para los controladores Spring MVC en su capa de presentación. A@Controller
normalmente tendría una asignación de URL y se activará mediante una solicitud web.fuente
@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.
fuente
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.
fuente
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.
fuente
De primavera en acción
fuente
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
fuente
fuente