SpringBoot
Tutorial SpringBoot: Servicios en Spring
Spring Boot servicios: creación y uso. Domina la creación y uso de servicios en Spring Boot con ejemplos prácticos y detallados.
Aprende SpringBoot GRATIS y certifícateQué es un servicio, qué es el patrón Service Layer y su rol en arquitecturas de capas
En el contexto de Spring Boot 3, un servicio es un componente fundamental que encapsula la lógica de negocio de una aplicación. Estos servicios actúan como intermediarios entre los controladores y los repositorios, gestionando las operaciones necesarias para cumplir con los requisitos funcionales. Al centralizar la lógica de negocio en los servicios, se promueve una separación de responsabilidades clara, facilitando el mantenimiento y la escalabilidad del sistema.
El patrón Service Layer es una estrategia arquitectónica que organiza la lógica de negocio en una capa específica dentro de una arquitectura de capas. Este patrón define una interfaz que expone métodos que representan las operaciones del negocio, permitiendo así una abstracción que desacopla la lógica de negocio de los detalles de implementación.
Por ejemplo, consideremos un servicio de gestión de usuarios:
@Service
public class UsuarioService {
private final UsuarioRepositorio usuarioRepositorio;
public UsuarioService(UsuarioRepositorio usuarioRepositorio) {
this.usuarioRepositorio = usuarioRepositorio;
}
public Usuario crearUsuario(UsuarioDTO usuarioDTO) {
// Lógica de negocio para crear un usuario
}
public Usuario obtenerUsuarioPorId(Long id) {
// Lógica de negocio para obtener un usuario
}
}
En este ejemplo, UsuarioService
actúa como la capa de servicio, encargándose de las operaciones relacionadas con los usuarios y coordinando con el repositorio para el acceso a datos. Esta separación permite que los controladores se centren en manejar las solicitudes y respuestas, delegando la lógica compleja al servicio correspondiente.
El rol de la Service Layer en las arquitecturas de capas es esencial para mantener una estructura organizada y modular. Al disponer de una capa de servicios bien definida, se facilita la reutilización del código, la implementación de pruebas unitarias y la incorporación de nuevas funcionalidades sin afectar otras capas del sistema. Además, esta capa puede gestionar transacciones, manejar excepciones y aplicar políticas de seguridad, actuando como un punto centralizado para dichos aspectos transversales.
Integrar el patrón Service Layer contribuye a una arquitectura más robusta y adaptable. Por ejemplo, si en el futuro se decide cambiar la forma en que se almacenan los datos, únicamente sería necesario modificar la capa de servicio sin impactar los controladores o las capas de presentación. Esto no solo mejora la mantenibilidad del código, sino que también reduce el riesgo de errores al aislar cambios a una única capa del sistema.
Crear servicio con @Service y diferencia con @Component
En Spring Boot 3, la creación de servicios se facilita mediante la anotación @Service
, que es una especialización de @Component
. Al definir una clase con @Service
, se indica de manera explícita que dicha clase contiene la lógica de negocio de la aplicación, lo que mejora la legibilidad y el mantenimiento del código. Por ejemplo:
import org.springframework.stereotype.Service;
@Service
public class GestionUsuarioService {
private final UsuarioRepositorio usuarioRepositorio;
public GestionUsuarioService(UsuarioRepositorio usuarioRepositorio) {
this.usuarioRepositorio = usuarioRepositorio;
}
public Usuario crearUsuario(UsuarioDTO usuarioDTO) {
// Implementación de la lógica de negocio para crear un usuario
}
public Usuario obtenerUsuarioPorId(Long id) {
// Implementación de la lógica de negocio para obtener un usuario
}
}
Aunque tanto @Service
como @Component
permiten que Spring detecte y gestione los beans, utilizar @Service
aporta una semántica más clara, diferenciando los servicios de otros componentes como controladores o repositorios. Esta distinción es beneficiosa para la organización del código y para otros desarrolladores que trabajan en el proyecto.
Además, @Service
puede integrarse con aspectos transversales específicos, como la gestión de transacciones o la monitorización, sin necesidad de configuraciones adicionales. Por otro lado, @Component
es una anotación más genérica que se utiliza para cualquier bean gestionado por Spring, lo que puede llevar a una menor claridad en proyectos grandes si se usa indiscriminadamente.
Es común que los desarrolladores prefieran @Service
al definir servicios debido a su propósito específico, lo que facilita la identificación de la capa de negocio dentro de la arquitectura de la aplicación. Por ejemplo, al revisar el código, es inmediato reconocer qué clases están destinadas a contener la lógica de negocio simplemente observando la anotación @Service
.
import org.springframework.stereotype.Component;
@Component
public class UtilsComponent {
public String formatearNombre(String nombre) {
return nombre.trim().toUpperCase();
}
}
En este ejemplo, UtilsComponent
utiliza @Component
porque no está directamente relacionado con la lógica de negocio, sino que proporciona funcionalidades auxiliares. Esta clasificación ayuda a mantener una estructura coherente y entendible en el proyecto.
Finalmente, el uso adecuado de @Service
y @Component
contribuye a una mejor mantenibilidad y escalabilidad de la aplicación, permitiendo que cada componente cumpla con su responsabilidad específica dentro del sistema. Adherirse a estas prácticas recomendadas asegura un código más limpio y fácil de gestionar a lo largo del ciclo de vida del desarrollo.
Inyectar repositorios y servicios dentro de servicios, inyectar servicios en controladores
En Spring Boot 3, la inyección de dependencias es fundamental para gestionar las relaciones entre los distintos componentes de una aplicación. Esta práctica permite que los servicios accedan a los repositorios necesarios para interactuar con la base de datos, así como que los controladores utilicen los servicios para procesar las solicitudes de los clientes. A continuación, se detalla cómo realizar estas inyecciones de manera efectiva.
Para inyectar un repositorio dentro de un servicio, se utiliza la anotación @Autowired
en el constructor del servicio. Este enfoque, conocido como inyección por constructor, es preferible ya que promueve la inmutabilidad de las dependencias y facilita las pruebas unitarias. Por ejemplo:
import org.springframework.stereotype.Service;
@Service
public class ProductoService {
private final ProductoRepositorio productoRepositorio;
public ProductoService(ProductoRepositorio productoRepositorio) {
this.productoRepositorio = productoRepositorio;
}
public Producto obtenerProducto(Long id) {
return productoRepositorio.findById(id)
.orElseThrow(() -> new ProductoNoEncontradoException(id));
}
// Otros métodos de negocio
}
En este ejemplo, ProductoService
depende de ProductoRepositorio
para acceder a los datos de los productos. La inyección por constructor garantiza que ProductoRepositorio
se inicialice correctamente al crear una instancia de ProductoService
.
Además de los repositorios, es posible que un servicio necesite interactuar con otros servicios. Esto se logra de manera similar, inyectando el servicio requerido a través del constructor. Consideremos un escenario en el que PedidoService
necesita utilizar ProductoService
para procesar los pedidos:
import org.springframework.stereotype.Service;
@Service
public class PedidoService {
private final PedidoRepositorio pedidoRepositorio;
private final ProductoService productoService;
public PedidoService(PedidoRepositorio pedidoRepositorio, ProductoService productoService) {
this.pedidoRepositorio = pedidoRepositorio;
this.productoService = productoService;
}
public Pedido crearPedido(PedidoDTO pedidoDTO) {
Producto producto = productoService.obtenerProducto(pedidoDTO.getProductoId());
// Lógica para crear el pedido
}
// Otros métodos de negocio
}
Al inyectar ProductoService
en PedidoService
, se fomenta la reutilización del código y se mantiene una separación de responsabilidades clara entre los diferentes servicios.
En el contexto de los controladores, la inyección de servicios permite delegar la lógica de negocio a los servicios correspondientes, manteniendo así los controladores enfocados en manejar las solicitudes y respuestas HTTP. La inyección se realiza igualmente mediante el constructor. Por ejemplo:
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/api/productos")
public class ProductoController {
private final ProductoService productoService;
public ProductoController(ProductoService productoService) {
this.productoService = productoService;
}
@GetMapping("/{id}")
public ResponseEntity<Producto> obtenerProducto(@PathVariable Long id) {
Producto producto = productoService.obtenerProducto(id);
return ResponseEntity.ok(producto);
}
// Otros endpoints
}
Este enfoque asegura que ProductoController
no maneje directamente la lógica de negocio ni el acceso a datos, sino que confíe en ProductoService
para estas responsabilidades. De esta manera, se facilita la mantenibilidad y la escalabilidad de la aplicación, permitiendo modificaciones en la lógica de negocio sin impactar los controladores.
Es importante destacar que, para que la inyección de dependencias funcione correctamente, los servicios y repositorios deben estar adecuadamente anotados con @Service
y @Repository
, respectivamente, o con @Component
si es necesario. Además, Spring Boot gestiona automáticamente el ciclo de vida de estos beans, asegurando que las dependencias se resuelvan de manera eficiente y consistente.
Al estructurar las inyecciones de dependencias de esta manera, se promueve una arquitectura limpia y modular, facilitando tanto el desarrollo como el testing de la aplicación. Los servicios bien inyectados permiten aislar la lógica de negocio, realizar pruebas unitarias de manera más sencilla y adaptar la aplicación a futuros cambios con menor esfuerzo.
Gestión de transacciones en servicios y problemas a evitar
La gestión de transacciones es un aspecto fundamental en el desarrollo de aplicaciones empresariales con Spring Boot 3, ya que garantiza la consistencia y la integridad de los datos durante las operaciones que involucran múltiples pasos. En el contexto de los servicios, las transacciones aseguran que todas las operaciones dentro de un método anotado con @Transactional
se completen exitosamente o, en caso contrario, que se realice una reversión para mantener el estado de la base de datos consistente.
Para implementar la gestión de transacciones en un servicio, se utiliza la anotación @Transactional
proporcionada por Spring Framework. Esta anotación puede aplicarse a nivel de clase o de método, definiendo el alcance de la transacción. Por ejemplo:
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@Service
public class OrdenService {
private final OrdenRepositorio ordenRepositorio;
private final InventarioService inventarioService;
public OrdenService(OrdenRepositorio ordenRepositorio, InventarioService inventarioService) {
this.ordenRepositorio = ordenRepositorio;
this.inventarioService = inventarioService;
}
@Transactional
public void procesarOrden(OrdenDTO ordenDTO) {
Orden orden = new Orden(ordenDTO);
ordenRepositorio.save(orden);
inventarioService.actualizarInventario(ordenDTO.getProductos());
// Otras operaciones relacionadas con la orden
}
}
En este ejemplo, el método procesarOrden
está marcado con @Transactional
, lo que indica que todas las operaciones dentro de este método forman parte de una única transacción. Si alguna de las operaciones falla, la transacción se revierte automáticamente, asegurando que la base de datos no quede en un estado inconsistente.
Es posible personalizar el comportamiento de las transacciones mediante atributos de la anotación @Transactional
, como el nivel de propagación y el nivel de aislamiento. Por ejemplo:
@Transactional(propagation = Propagation.REQUIRES_NEW, isolation = Isolation.SERIALIZABLE)
public void metodoConTransaccionPersonalizada() {
// Implementación del método
}
En este caso, Propagation.REQUIRES_NEW
indica que se debe iniciar una nueva transacción, suspendiendo cualquier transacción existente, mientras que Isolation.SERIALIZABLE
establece el nivel más alto de aislamiento para evitar problemas como las lecturas sucias o lecturas no repetibles.
A pesar de las ventajas, existen problemas comunes que deben evitarse al gestionar transacciones en servicios:
Propagación inadecuada de transacciones: Utilizar niveles de propagación incorrectos puede llevar a transacciones anidadas innecesariamente o a que las transacciones existentes no se comporten según lo esperado. Es esencial entender cómo funciona cada nivel de propagación para aplicarlo adecuadamente según el caso de uso.
Manejo incorrecto de excepciones: Por defecto, Spring sólo realiza una reversión de la transacción para RuntimeExceptions y errores. Si se lanzan excepciones verificadas que no extienden de RuntimeException
, la transacción no se revertirá a menos que se configure explícitamente. Para manejar esto, se puede especificar en la anotación @Transactional
qué excepciones deben desencadenar una reversión:
@Transactional(rollbackFor = { SQLException.class })
public void metodoQuePuedeLanzarSQLException() throws SQLException {
// Implementación del método
}
Anotaciones en métodos privados o no gestionados por Spring: Spring maneja las transacciones mediante proxies. Si la anotación @Transactional
se aplica a métodos privados o a métodos que no son llamados a través del proxy de Spring (por ejemplo, llamadas internas dentro de la misma clase), la transacción no será gestionada correctamente. Por lo tanto, es crucial aplicar @Transactional
sólo a métodos públicos o protegidos que sean accesibles a través del proxy.
Transacciones demasiado largas: Mantener una transacción abierta durante un tiempo prolongado puede afectar el rendimiento de la aplicación y aumentar la posibilidad de bloqueos en la base de datos. Se recomienda mantener las transacciones lo más breves posible, limitando su alcance a sólo las operaciones que realmente requieren atomicidad.
Falta de manejo de commit y rollback manual: Aunque Spring gestiona automáticamente las transacciones, en algunos casos avanzados puede ser necesario manejar el commit y rollback de forma manual utilizando TransactionTemplate
o PlatformTransactionManager
. Sin embargo, esto añade complejidad y debe hacerse con precaución para evitar inconsistencias en los datos.
No utilizar adecuadamente los niveles de aislamiento: Seleccionar un nivel de aislamiento inapropiado puede llevar a problemas de concurrencia, como phantom reads o non-repeatable reads. Es fundamental comprender los diferentes niveles de aislamiento y elegir el que mejor se adapte a las necesidades de la aplicación, equilibrando la consistencia y el rendimiento.
Para ilustrar un uso correcto de la gestión de transacciones, consideremos el siguiente ejemplo donde se actualizan múltiples entidades dentro de una única transacción:
@Service
public class ReservaService {
private final ReservaRepositorio reservaRepositorio;
private final UsuarioRepositorio usuarioRepositorio;
public ReservaService(ReservaRepositorio reservaRepositorio, UsuarioRepositorio usuarioRepositorio) {
this.reservaRepositorio = reservaRepositorio;
this.usuarioRepositorio = usuarioRepositorio;
}
@Transactional
public void realizarReserva(Long usuarioId, ReservaDTO reservaDTO) {
Usuario usuario = usuarioRepositorio.findById(usuarioId)
.orElseThrow(() -> new UsuarioNoEncontradoException(usuarioId));
Reserva reserva = new Reserva(reservaDTO);
reserva.setUsuario(usuario);
reservaRepositorio.save(reserva);
usuario.incrementarNumeroReservas();
usuarioRepositorio.save(usuario);
}
}
En este escenario, tanto la creación de una nueva reserva como la actualización del contador de reservas del usuario forman parte de una única transacción. Si alguna de estas operaciones falla, ninguna de las dos se aplicará, manteniendo la integridad de los datos.
Una gestión adecuada de las transacciones en los servicios de Spring Boot 3 es esencial para asegurar que las operaciones de negocio se ejecuten de manera atomica y consistentemente. Al seguir las mejores prácticas y estar atentos a los problemas comunes, se puede garantizar que la aplicación maneje correctamente situaciones complejas sin comprometer la fiabilidad y la consistencia de los datos.
Gestión de errores y excepciones en servicios
En el desarrollo de servicios con Spring Boot 3, una gestión adecuada de errores y excepciones es esencial para garantizar la robustez y la fiabilidad de la aplicación. Los servicios deben ser capaces de manejar situaciones inesperadas de manera elegante, proporcionando información clara tanto a los desarrolladores como a los consumidores de la API.
Para manejar excepciones en los servicios, es común definir una jerarquía de excepciones personalizadas que reflejen los distintos tipos de errores que pueden ocurrir en la lógica de negocio. Por ejemplo, considerar una aplicación de gestión de pedidos, podríamos tener excepciones como PedidoNoEncontradoException
o InventarioInsuficienteException
. Estas excepciones permiten identificar problemas específicos y responder de manera adecuada.
public class PedidoNoEncontradoException extends RuntimeException {
public PedidoNoEncontradoException(Long id) {
super("Pedido no encontrado con ID: " + id);
}
}
Es recomendable que las excepciones personalizadas extiendan de RuntimeException
, ya que Spring automáticamente detecta estas excepciones no comprobadas y puede gestionar las transacciones en consecuencia, realizando un rollback si es necesario.
Dentro de los servicios, las excepciones pueden ser lanzadas cuando se detectan situaciones excepcionales. Por ejemplo:
@Service
public class PedidoService {
private final PedidoRepositorio pedidoRepositorio;
public PedidoService(PedidoRepositorio pedidoRepositorio) {
this.pedidoRepositorio = pedidoRepositorio;
}
public Pedido obtenerPedidoPorId(Long id) {
return pedidoRepositorio.findById(id)
.orElseThrow(() -> new PedidoNoEncontradoException(id));
}
// Otros métodos de negocio
}
Para una gestión centralizada de las excepciones, Spring Boot ofrece el uso de Controladores de Excepción Global mediante la anotación @ControllerAdvice
. Esta clase puede interceptar las excepciones lanzadas por los servicios y controladores, permitiendo definir respuestas HTTP estandarizadas.
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(PedidoNoEncontradoException.class)
public ResponseEntity<String> manejarPedidoNoEncontrado(PedidoNoEncontradoException ex) {
return new ResponseEntity<>(ex.getMessage(), HttpStatus.NOT_FOUND);
}
@ExceptionHandler(InventarioInsuficienteException.class)
public ResponseEntity<String> manejarInventarioInsuficiente(InventarioInsuficienteException ex) {
return new ResponseEntity<>(ex.getMessage(), HttpStatus.BAD_REQUEST);
}
@ExceptionHandler(Exception.class)
public ResponseEntity<String> manejarExcepcionesGenericas(Exception ex) {
return new ResponseEntity<>("Ocurrió un error inesperado", HttpStatus.INTERNAL_SERVER_ERROR);
}
}
Este enfoque permite separar la lógica de manejo de errores de la lógica de negocio, mejorando la mantenibilidad y la claridad del código. Además, facilita la implementación de respuestas coherentes y detalladas para diferentes tipos de errores, lo que mejora la experiencia de los consumidores de la API.
Para enriquecer las respuestas de error, es posible crear datos estructurados que incluyan información adicional, como códigos de error, mensajes descriptivos y detalles de depuración. Por ejemplo:
public class ApiError {
private int codigo;
private String mensaje;
private String detalle;
// Constructores, getters y setters
}
Y actualizar el controlador de excepciones para utilizar este objeto:
@ExceptionHandler(PedidoNoEncontradoException.class)
public ResponseEntity<ApiError> manejarPedidoNoEncontrado(PedidoNoEncontradoException ex) {
ApiError error = new ApiError(404, ex.getMessage(), "El pedido solicitado no existe en la base de datos");
return new ResponseEntity<>(error, HttpStatus.NOT_FOUND);
}
Esta estructuración de los errores permite a los consumidores de la API interpretar y manejar las fallas de manera más efectiva, ya que pueden programar respuestas específicas basadas en los códigos de error proporcionados.
Además de las excepciones personalizadas y los controladores de excepción global, Spring Boot 3 facilita el uso de aspectos (AOP) para implementar manejo de errores transversales. Mediante aspectos, es posible interceptar métodos de servicio y aplicar lógica de manejo de excepciones de manera repetible y centralizada.
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;
@Aspect
@Component
public class LoggingAspect {
@AfterThrowing(pointcut = "execution(* com.miapp.servicios.*.*(..))", throwing = "ex")
public void logException(Exception ex) {
// Implementación del logging de la excepción
System.err.println("Excepción capturada: " + ex.getMessage());
}
}
Este enfoque permite añadir funcionalidades como logging, monitorización o notificaciones cuando se producen excepciones, sin modificar directamente la lógica de los servicios, promoviendo así una separación de preocupaciones efectiva.
Es importante también considerar el uso de validaciones dentro de los servicios para prevenir la ocurrencia de errores. Spring Boot proporciona el módulo Spring Validation que permite definir restricciones sobre los datos de entrada utilizando anotaciones como @NotNull
, @Size
, entre otras. Este enfoque garantiza que los datos cumplen con los criterios requeridos antes de que la lógica de negocio sea ejecutada.
public class PedidoDTO {
@NotNull(message = "El ID del producto es obligatorio")
private Long productoId;
@Min(value = 1, message = "La cantidad debe ser al menos 1")
private int cantidad;
// Getters y setters
}
Al combinar validaciones robustas con una gestión adecuada de excepciones, los servicios en Spring Boot 3 pueden manejar de manera efectiva tanto los errores anticipados como los inesperados, asegurando así una experiencia consistente y predecible para los usuarios finales y facilitando el mantenimiento y la evolución de la aplicación.
Ejercicios de esta lección Servicios en Spring
Evalúa tus conocimientos de esta lección Servicios en Spring con nuestros retos de programación de tipo Test, Puzzle, Código y Proyecto con VSCode, guiados por IA.
API Query By Example (QBE)
Identificadores y relaciones JPA
Borrar datos de base de datos
Web y Test Starters
Métodos find en repositorios
Controladores Spring MVC
Inserción de datos
CRUD Customers Spring MVC + Spring Data JPA
Backend API REST con Spring Boot
Controladores Spring REST
Uso de Spring con Thymeleaf
API Specification
Registro de usuarios
Crear entidades JPA
Asociaciones en JPA
Asociaciones de entidades JPA
Integración con Vue
Consultas JPQL
Open API y cómo agregarlo en Spring Boot
Uso de Controladores REST
Repositorios reactivos
Inyección de dependencias
Introducción a Spring Boot
CRUD y JPA Repository
Inyección de dependencias
Vista en Spring MVC con Thymeleaf
Servicios en Spring
Operadores Reactivos
Configuración de Vue
Entidades JPA
Integración con Angular
API Specification
API Query By Example (QBE)
Controladores MVC
Anotaciones y mapeo en JPA
Consultas JPQL con @Query en Spring Data JPA
Repositorios Spring Data
Inyección de dependencias
Data JPA y Mail Starters
Configuración de Angular
Controladores Spring REST
Configuración de Controladores MVC
Consultas JPQL con @Query en Spring Data JPA
Actualizar datos de base de datos
Verificar token JWT en peticiones
Login de usuarios
Integración con React
Configuración de React
Todas las lecciones de SpringBoot
Accede a todas las lecciones de SpringBoot y aprende con ejemplos prácticos de código y ejercicios de programación con IDE web sin instalar nada.
Introducción A Spring Boot
Introducción Y Entorno
Spring Boot Starters
Introducción Y Entorno
Inyección De Dependencias
Introducción Y Entorno
Controladores Spring Mvc
Spring Web
Vista En Spring Mvc Con Thymeleaf
Spring Web
Controladores Spring Rest
Spring Web
Open Api Y Cómo Agregarlo En Spring Boot
Spring Web
Servicios En Spring
Spring Web
Clientes Resttemplate Y Restclient
Spring Web
Rxjava En Spring Web
Spring Web
Crear Entidades Jpa
Persistencia Spring Data
Asociaciones De Entidades Jpa
Persistencia Spring Data
Repositorios Spring Data
Persistencia Spring Data
Métodos Find En Repositorios
Persistencia Spring Data
Inserción De Datos
Persistencia Spring Data
Actualizar Datos De Base De Datos
Persistencia Spring Data
Borrar Datos De Base De Datos
Persistencia Spring Data
Consultas Jpql Con @Query En Spring Data Jpa
Persistencia Spring Data
Api Query By Example (Qbe)
Persistencia Spring Data
Api Specification
Persistencia Spring Data
Repositorios Reactivos
Persistencia Spring Data
Introducción E Instalación De Apache Kafka
Mensajería Asíncrona
Crear Proyecto Con Apache Kafka
Mensajería Asíncrona
Creación De Producers
Mensajería Asíncrona
Creación De Consumers
Mensajería Asíncrona
Kafka Streams En Spring Boot
Mensajería Asíncrona
Introducción A Spring Webflux
Reactividad Webflux
Spring Data R2dbc
Reactividad Webflux
Controlador Rest Reactivo Basado En Anotaciones
Reactividad Webflux
Controlador Rest Reactivo Funcional
Reactividad Webflux
Operadores Reactivos Básicos
Reactividad Webflux
Operadores Reactivos Avanzados
Reactividad Webflux
Cliente Reactivo Webclient
Reactividad Webflux
Introducción A Spring Security
Seguridad Con Spring Security
Seguridad Basada En Formulario En Mvc Con Thymeleaf
Seguridad Con Spring Security
Registro De Usuarios
Seguridad Con Spring Security
Login De Usuarios
Seguridad Con Spring Security
Verificar Token Jwt En Peticiones
Seguridad Con Spring Security
Seguridad Jwt En Api Rest Spring Web
Seguridad Con Spring Security
Seguridad Jwt En Api Rest Reactiva Spring Webflux
Seguridad Con Spring Security
Autenticación Y Autorización Con Anotaciones
Seguridad Con Spring Security
Testing Unitario De Componentes Y Servicios
Testing Con Spring Test
Testing De Repositorios Spring Data Jpa
Testing Con Spring Test
Testing Controladores Spring Mvc Con Thymeleaf
Testing Con Spring Test
Testing Controladores Rest Con Json
Testing Con Spring Test
Testing De Aplicaciones Reactivas Webflux
Testing Con Spring Test
Testing De Seguridad Spring Security
Testing Con Spring Test
Testing Con Apache Kafka
Testing Con Spring Test
Integración Con Angular
Integración Frontend
Integración Con React
Integración Frontend
Integración Con Vue
Integración Frontend
En esta lección
Objetivos de aprendizaje de esta lección
- Comprender el concepto de servicios en Spring y su importancia en la arquitectura de una aplicación.
- Aprender a declarar un servicio en Spring utilizando la anotación
@Service
. - Entender cómo inyectar dependencias en los servicios con
@Autowired
. - Conocer la gestión de transacciones en los servicios de Spring.
- Familiarizarse con la creación de servicios REST utilizando Spring Boot.
- Practicar la implementación y el testing de servicios en Spring.