Este libro proporciona los elementos clave para orientarse en las diferentes tecnologías que se utilizan en losproyectos basados en Spring. Tiene en cuenta las diferentes configuraciones relacionadas con las versiones deSpring (en la versión 4.3 y 5.3 en el momento de la redacción del libro) y se basa en ejemplos de uso concretos.Permite que el lector adquiera rápidamente una gran autonomía en un proyecto empresarial que utilizaSpring, ya sea durante las fases iniciales de un nuevo proyecto o...
Este libro proporciona los elementos clave para orientarse en las diferentes tecnologías que se utilizan en los proyectos basados en Spring. Tiene en cuenta las diferentes configuraciones relacionadas con las versiones de Spring (en la versión 4.3 y 5.3 en el momento de la redacción del libro) y se basa en ejemplos de uso concretos. Permite que el lector adquiera rápidamente una gran autonomía en un proyecto empresarial que utiliza Spring, ya sea durante las fases iniciales de un nuevo proyecto o para mantener un proyecto existente: comprensión del núcleo, acceso a los datos y control de la capa web. El conocimiento del desarrollo Java y, en particular, el desarrollo de aplicaciones web, es un requisito previo esencial para aprovechar al máximo el libro.
En primer lugar, el autor presenta los elementos más sencillos y comunes de Spring (la configuración, los contextos y las librerías de terceros) y posteriormente, explica algunos aspectos más complejos que normalmente se encuentran en los proyectos (Recursos, Binders, Validadores, Conversores y pruebas). Se experimenta con la programación orientada a aspectos y se detallan las aplicaciones web Spring MVC y los Web Services, con las pruebas unitarias asociadas. El autor presenta las novedades Spring Boot, Kotlin con Angular, las aplicaciones orientadas a mensajes y Spring Batch, una introducción a Reactor y WebFlux y una descripción de la parte Spring de un proyecto generado a partir de JHipster para ilustrar una implementación muy actual, así como una presentación sobre el uso de GraphQL con Spring.
A lo largo de los capítulos, el autor se basa en ejemplos funcionales para permitir la experimentación lo antes posible por parte del lector. Para este propósito, los elementos están disponibles para su descarga en el sitio web www.ediciones-eni.com/.
6. Requisitos previos para abordar Spring y Jakarta EE
7. Objetivos del libro
Componentes del framework
1. Introducción
2. Aspectos históricos
3. Utilidad de Spring en un proyecto
4. Visión general y temas tratados en el libro
4.1 Los módulos Spring
4.2 Temas tratados
4.3 Versión de los componentes de Spring utilizados en el libro
4.4 Versión de recursos externos
4.5 Gestión de dependencias de Maven
4.6 Usar una BOM (Bill Of Materials) Maven
5. Complementos
6. Puntos clave
Spring y Design Patterns
1. Introducción
2. El singleton en Java
2.1 Objetivo
2.2 Solución Spring
2.3 Ejemplo
3. Inversión de control
4. Facade
5. Factory
6. Decorador
7. Proxy
8. Modelo Vista Controlador (MVC)
9. Templates
10. Estrategia
11. Puntos clave
Recordatorios sobre elementos externos a Spring
1. Codificación equals y hashCode
1.1 Descripción del problema
1.2 Implementación
2. Proyecto Lombok
3. Sistemas de registro de actividad o log
4. Bases de datos H2
4.1 Descripción del problema
4.2 Implementación
4.2.1 Instalación
4.2.2 Configurar el POM
4.2.3 Conexión a la base de datos mediante JDBC
4.2.4 Usar un listener de servlets para iniciar y detener la base de datos
5. Proyectos Maven
5.1 Descripción del problema
5.2 Implementación
5.3 Instalación de Maven en Windows
5.4 Utilizar un arquetipo Maven
5.5 Contenido del archivo pom.xml en los casos sencillos utilizados en este libro
6. Spring y las versiones de Java
7. Puntos clave
El contenedor Spring
1. Introducción
2. Origen
3. Los módulos fundamentales
3.1 Composición de un bean
3.2 El singleton y el prototipo
3.3 Los objetos fundamentales del paquete core
3.3.1 El PropertyEditor
3.4 PropertyValues
3.5 BranWrapper
3.6 BeanFactory
3.7 La interfaz BeanDefinition
3.8 PropertyPlaceholderConfigure
3.9 Los objetos fundamentales del paquete context
3.10 Relación entre el bean, su BeanFactory o su contexto
4. Configuración de los beans
4.1 Configuración mediante un archivo XML
4.2 Configuración con anotaciones
4.3 Configurar los beans de aplicación implícitamente
4.4 Configuración por lambdas
5. Uso de beans: inyección para setters y constructores
5.1 Asignación mediante el constructor en XML
5.2 Comparación de los métodos de instanciación
5.3 Otras anotaciones de configuración
5.3.1 La anotación @Primary
5.3.2 Las anotaciones @Profile y @Conditional
6. Control del ciclo de vida: construcción y destrucción
7. Ejemplo que ilustra los mappings estándares
7.1 El Proyecto Maven
7.2 Archivo de configuración de Spring
7.3 Dependencia de Spring Core y sistema de registro
7.4 Dependencia de librerías de pruebas unitarias
7.5 Ejemplo que ilustra el uso de los logs
7.6 Archivo de configuración específico de las pruebas
8. Spring Expression Language
8.1 Uso de ExpressionParser
8.2 EvaluationContext
8.3 Uso con @Value
9. Servidores J2EE, Java EE y Jakarta EE
9.1 Aspectos generales
9.2 Web services
9.2.1 A través de un servlet
9.2.2 Servidor integrado
9.3 Los EJB
9.3.1 Funcionamiento
9.3.2 Creación del EJB remoto
9.3.3 Configuración de Maven en el lado del cliente
9.3.4 Creación del cliente
9.3.5 Integración adicional
9.3.6 El design pattern Business Delegate
10. Puntos clave
Configuración avanzada
1. Introducción
2. Archivos de recursos
2.1 Archivos de recursos estándares
2.2 Archivos de recursos cargados con el contexto Spring
2.3 Archivos de recursos cargados con un servicio ResourceLoaderAware
2.3.1 El programa principal (main)
2.3.2 El servicio ResourceLoaderAware
3. Conversores y formateadores
3.1 Built-in converters
3.1.1 Para los tipos estándares
3.1.2 Para tablas y listas
3.1.3 Para las enumeraciones
3.1.4 Para objetos en general
3.2 Convertir un Array en Collection y String
3.3 Converter Factory
3.3.1 Clase StringToUsuarioConverterFactory
3.3.2 Clase UsuarioToStringConverterFactory
3.3.3 Clase LasConversionesConFactories
3.4 Los formateadores predeterminados
3.4.1 Clase LasConversionesFormateadoras
3.5 Formateadores personalizados
3.5.1 Clase TarjetaDeCredito
3.5.2 Clase TarjetaDeCreditoParser
3.5.3 Clase TarjetaDeCreditoPrinter
3.5.4 Clase TarjetaDeCreditoFormatter
3.5.5 Clase LasConversionesFormateadoresEx2
4. BeanWrappers, binding y validadores
4.1 Clase LosBeanWrappers
4.2 Clase UsuarioValidador
5. Puntos clave
Programación orientada a aspectos con Spring
1. Introducción
2. ¿Por qué AOP?
3. Los conceptos de AOP
4. Límites de Spring AOP y uso de AspectJ
5. El soporte @AspectJ en Spring
5.1 Habilitar el soporte
5.2 Habilitación de @AspectJ con configuración XML
5.3 Habilitar @AspectJ con configuración Java
5.4 Declaración de un aspecto
5.5 Declaración de un pointcut
5.6 Declaración de graft sencillos
5.7 Tipos genéricos
5.8 Determinación de nombres de argumentos
5.9 Orden de llamada de los grafts que interceptan el punto de unión
5.10 Inyección
5.11 El mecanismo de los proxys
5.12 El lado oculto de los proxys en AOP
6. Las API de bajo nivel para Spring AOP
6.1 La interfaz PointCut
6.2 La interfaz ClassFilter
6.3 La interfaz MethodMatcher
7. Puntos clave
Pruebas y Spring
1. Introducción
2. Los mock objects
2.1 Mocks especializados por «entorno»
2.2 Soporte
2.2.1 Utilidades generales
2.2.2 Spring MVC
2.3 Pruebas de integración
2.3.1 Visión general
2.3.2 Almacenamiento en caché del contexto de prueba
2.3.3 Pruebas back y front
2.4 Anotaciones
2.4.1 @ContextConfiguration
2.4.2 @WebAppConfiguration
2.4.3 @ContextHierarchy
2.4.4 @ActiveProfiles
2.4.5 @TestPropertySource
2.4.6 @DirtiesContext
2.4.7 Interfaz TestExecutionListener
2.4.8 @TransactionConfiguration
2.4.9 @Transactional
2.4.10 @Rollback
2.4.11 @BeforeTransaction
2.4.12 @AfterTransaction
2.4.13 @Sql, @SqlConfig y @SqlGroup
2.5 Anotaciones estándares
3. Los frameworks de test JUnit y TestNG
3.1 Utilización con JUnit 4
3.1.1 Spring JUnit Runner
3.1.2 @IfProfileValue
3.1.3 @ProfileValueSourceConfiguration
3.1.4 @Timed
3.1.5 @Repeat
3.1.6 Meta-anotaciones de soporte para las pruebas
3.2 Los misterios del framework Spring TestContext
3.2.1 Clases e interfaces del framework de pruebas
3.2.2 Configurar TestExecutionListener con anotaciones
3.2.3 TestExecutionListeners
3.2.4 Mezcla XML y clases anotadas
3.3 Configuración de los contextos de prueba
3.3.1 Configuración de contexto con inicializadores de contexto
3.3.2 Herencia en la configuración de los contextos
3.3.3 Soporte de los perfiles de entorno
3.3.4 Configuración de contexto con archivos de propiedades de prueba
3.3.5 Declarar un archivo de propiedades para las pruebas
3.3.6 Detección del archivo de propiedades predeterminado
3.4 Jerarquía de los contextos de prueba
3.4.1 Herencia y sobrecarga de propiedades de prueba
3.4.2 Cargar un WebApplicationContext
3.4.3 Convenciones
3.4.4 La semántica de los recursos explícitos
3.4.5 Inyectar objetos mokeados
3.4.6 Cacheado del contexto de prueba
3.4.7 Jerarquías de contexto
3.4.8 Inyección de dependencias en las pruebas
3.5 El scope session durante una prueba de consulta
3.5.1 El scope session durante una prueba de consulta
3.5.2 Pruebas de beans de scope request
3.5.3 Configuración de un bean de scope session
3.6 Las transacciones
3.6.1 Gestión de transacciones
3.6.2 Transacciones administradas por la prueba
3.6.3 Activación y desactivación de las transacciones
3.6.4 Comportamiento del commit y del rollback de una transacción
3.6.5 Ejecutar código fuera de una transacción
3.6.6 Configurar un administrador de transacciones
3.6.7 Mostrar todas las anotaciones relacionadas con la transacción
3.7 Los scripts SQL
3.7.1 Ejecutar scripts SQL
3.7.2 La semántica del path de los recursos
3.7.3 Detección predeterminada de scripts
3.7.4 Declarar varios @Sql
3.7.5 Fases de ejecución de los scripts
3.7.6 Script de configuración con SqlConfig
3.7.7 Gestión de transacciones para @Sql
3.8 Clases de soporte TestContext
3.8.1 Clases de soporte de JUnit
3.8.2 Spring JUnit Runner
3.9 Framework Spring MVC Test
3.9.1 Proyecto autónomo
3.9.2 Pruebas del lado del servidor
3.9.3 Definir expectativas
3.9.4 Añadir filtros
3.9.5 Pruebas REST del lado cliente
3.10 Otros recursos
4. Puntos clave
Parte back de la aplicación
1. Descripción del problema
2. Implementación
2.1 Configuración de una entidad de la capa de dominio
2.2 Acceso al objeto de dominio
2.3 Eliminación en cascada
2.4 Consultas tipadas
2.5 Caché de nivel 1 y 2
2.6 Bean Validation (JSR-303)
2.7 La API Criteria
2.8 Acceso a la base de datos
2.9 El archivo persistence.xml
2.10 Pruebas JPA
3. Para ir más allá
3.1 Librería Java jcabi-aspects
3.2 Métricas AspectJ
4. Usar MapStruct
4.1 Enfoque API-First
5. Herramientas
5.1 Swagger
5.2 OpenAPITools
5.3 Otros
6. Generadores de código
7. Uso del plugin
7.1 Para el generador Swagger
7.2 Para el generador OpenAPITools
8. Personalización
8.1 Swagger
8.2 OpenAPITools
9. Diseño de una descripción de API
10. Herramientas para el diseño de la API
11. Spring Actuator
12. Puntos clave
Spring en un contexto web JSP
1. Spring MVC
1.1 Funcionamiento global
1.1.1 Configuración XML sencilla
1.1.2 Configuración por anotaciones
1.2 Elementos complejos del controlador
1.2.1 Funcionamiento global del controlador
1.2.2 Ejemplo de clase simple
1.2.3 Revisión sencilla
1.2.4 Por el path
1.2.5 Por un patrón en el path
1.2.6 Por el path y un método
1.2.7 Mapeado por path + método + presencia de argumentos de query
1.2.8 Mapeado por path + método + presencia de un header
1.2.9 Por la ausencia de un header
1.2.10 Por consumo
1.2.11 Por producción a través de Accept=application/json
1.2.12 Por producción a través de Accept=application/xml
1.2.13 Argumentos de query
1.2.14 Grupos de argumentos de consulta
1.2.15 Variable del path
1.2.16 Cuerpo de consulta
1.2.17 Encabezado y cuerpo de la consulta
1.2.18 Argumentos en la consulta
1.2.19 Argumentos de la respuesta
1.2.20 Sesión
1.2.21 Handler personalizado
1.2.22 Leer los datos codificados en la URL
1.2.23 Leer una estructura XML
1.2.24 Escribir en una estructura XML a través de Accept=application/xml
1.2.25 Leer una estructura JSON
1.2.26 Escribir en una estructura JSON a través de Accept=application/json
1.2.27 HTML generado por una plantilla JSP
1.2.28 Mapping a partir de un modelo
1.2.29 Usar variables en una plantilla de vista
1.2.30 Data binding con variables de URI
1.2.31 Tipos primitivos
1.2.32 Fechas
1.2.33 Conversión de colecciones
1.2.34 Usar colecciones con formato
1.2.35 Trabajar con objetos personalizados
1.2.36 Usar un conversor personalizado
1.2.37 Validación
1.2.38 @ExceptionHandler en un controlador
1.2.39 @ExceptionHandler global
1.2.40 Plantillas de String para las URI
1.2.41 UriComponentsBuilder
2. Cliente REST
2.1 Utilización del RestTemplate
2.2 El bean de dominio con la anotación REST para los campos ausentes
3. Spring Security
3.1 Introducción a Spring Security
3.2 Spring Security en un entorno web
3.2.1 Autenticación por Spring
3.2.2 Autenticación por página de inicio de sesión personalizada
3.2.3 Autenticación por base de datos
4. Puntos clave
Integración JSF2
1. Introducción
2. Mojarra
3. Arquitectura
4. Ciclo de vida
4.1 Consulta
4.2 Restore View o Reconstruct Component Tree
4.3 Apply Request Value
4.4 Perform Validation
4.5 Synchronize Model o Update Model Values
4.6 Invoke Application Logic
4.7 Render Response
4.8 Respuesta
4.9 Archivo web.xml
4.10 Dependencias
4.11 Archivo faces-config.xml
4.12 Bean gestionado sin Spring
4.13 Ejemplo de vista JSF
4.14 Vista previa de un componente JSF
5. Integración Spring
5.1 Arquitectura
5.2 Dependencias
5.3 Archivo web.xml
5.4 Archivo faces-config.xml
5.5 Capas inferiores (back)
6. Puntos clave
Aplicación Spring Angular
1. Introducción
2. La parte backend
2.1 Generación de un backend
3. La parte frontend
3.1 Angular CLI
3.2 Creación del proyecto inicial
3.3 Inicio de la aplicación
3.4 Crear un servicio Cuenta
4. Puntos clave
Spring-HATEOAS
1. Introducción
1.1 Ejemplo de enlaces hipermedia codificados manualmente
1.2 Ir más allá con hipermedia
1.3 Autoconfiguración por anotaciones
1.4 Proveedores de relaciones
1.5 Proveedor de URI compacto
1.6 Soporte del lado del cliente
1.7 Descubrimiento de enlaces del lado del cliente
1.8 Uso del @RepositoryRestResource
2. Puntos clave
Documentación Spring REST Docs
1. Introducción
1.1 Dependencia de la librería de pruebas
1.2 Dependencia de los plugins Maven
1.3 Los extractos (snippets)
2. Ejemplo JUnit 5 (Jupiter)
3. Consulta y respuesta
4. Respuesta con JSON anidado
4.1 Parámetros de consulta
4.2 Los parámetros incluidos en el path
4.3 Las Request parts
4.4 Las Request parts payloads
4.5 Los campos
4.6 Enlaces hipermedia en la respuesta
4.7 Los encabezados
5. Personalización de la documentación
6. Acoplamiento Swagger 2
6.1 Utilizar Springfox
6.2 Fuera de Spring Boot
7. Uso con Spring Data Rest
8. Resumen de la documentación generada
9. Puntos clave
Spring Boot
1. Introducción
2. Configuración de los ejemplos
2.1 Configuración de Maven para la versión 1.5 de Spring Boot
2.2 Configuración Maven para la versión 2 de Spring Boot
2.3 Uso del hot swapping
2.4 Packaging y lanzamiento de la aplicación
2.5 Aplicación Spring MVC mínima
3. Configuración automática Spring Boot
4. Los starters
4.1 Starters comunes
4.2 Starters orientados a mensajes
4.3 Bases de datos
4.4 Servicios web
4.5 Motores de renderizado
4.6 Starters menos comunes
5. Spring MVC
6. Personalización de banners
7. Eventos de aplicación
8. Recuperación de argumentos de la línea de comandos
8.1 CommandLineRunner
8.2 ApplicationRunner
8.3 La configuración yaml y perfiles
9. La anotación EnableConfigurationProperties
10. Configurar los logs
10.1 Los logs de color
10.2 Elección del tipo de registro
11. Configuración automática para Spring MVC
12. Gestión de sesiones
13. Guía de migración de la versión 1.5 a la versión 2.x
13.1 Archivos de configuración
13.2 Diferentes comportamientos
13.3 Arranque
13.4 Utilizar ApplicationRunner o CommandLineRunner
13.5 Configuración externalizada
13.6 Desarrollo de aplicaciones web
13.7 Seguridad
14. Descripción avanzada de Spring Boot
15. Cargar el BootstrapContext
16. Configuración de los listeners
16.1 El starting: ApplicationStartingEvent
16.2 El entorno: ApplicationEnvironmentPreparedEvent
16.3 El EnvironmentPostProcessorApplicationListener
17. Configuración de logs
18. Creación de ApplicationContext
19. Preparación y refresco del contexto
20. EnableAutoConfiguration
21. Lanzamiento de runners
22. Puntos clave
Spring y NoSQL
1. Introducción
2. Modelos de datos
2.1 Modelo clave-valor
2.2 Modelo Documentos
2.3 Modelo Orientado a columnas
2.4 Bases de datos orientadas a grafos
3. Aspectos principales de la base de datos
4. Por qué y cuándo usar una base de datos NoSQL
5. Problemas con el uso de bases de datos NoSQL
6. Limitaciones de la base de datos NoSQL
7. Spring y NoSQL
8. Caché de datos
8.1 Caché sencilla
9. Ocultar datos con GemFire
10. GemFire como base de datos NoSQL
11. Redis independiente
11.1 Uso de Redis para la caché de datos
11.2 Utilizar Redis para gestionar mensajes
12. MongoDB
12.1 MongoDB con Spring Boot
12.2 MongoDB con una API REST
13. Puntos clave
Spring Batch
1. Introducción
2. Arquitectura de un batch
3. Ejemplo de Spring Batch versión 4
4. Cargador H2 desde un CSV
5. Dependencias Spring Batch 3 y 4
6. Otras novedades de la versión 4
7. Evoluciones de los batchs
8. Puntos clave
Los Middlewares de mensajes (MOM)
1. Introducción
2. Implementaciones open source
3. Implementaciones propietarias
4. Casos de uso
5. JMS y ActiveMQ
6. RabbitMQ
6.1 Spring AMQP y RabbitMQ
6.2 Ejemplo de RabbitMQ
7. Puntos clave
Spring y Kotlin
1. Introducción
2. Características principales del lenguaje Kotlin
2.1 Los métodos y las funciones
2.2 La inmutabilidad de los objetos
2.3 Los tipos
2.4 Gestión de valores nulos
2.5 Llamadas encadenadas seguras
2.6 Las lambdas
3. Controlador Spring MVC, Spring Boot en Kotlin
3.1 Función principal
3.2 Prueba asociada a la función principal
4. Los plugins
5. Puntos clave
Introducción a Spring Reactor y Spring Webflux
1. Introducción
2. Spring Reactor
2.1 Presentación
2.2 Uso de Reactor Core
2.2.1 Los threads
2.2.2 Las FutureTask
2.2.3 CompletableFuture
2.2.4 Flux y Mono
2.3 Las pruebas
2.3.1 Comprobaciones con StepVerifier
2.3.2 Emisiones manuales con TestPublisher
3. WebFlux
3.1 Definición del término responsivo
3.2 Las capas responsivas
3.2.1 La capa del controlador
3.2.2 La capa de los servicios
3.2.3 La capa repository
3.2.4 Repository responsivo R2DBC
4. Cliente responsivo
5. Pruebas con WebFlux
5.1 Pruebas unitarias
5.1.1 Pruebas unitarias con aplicaciones responsivas
5.1.2 Uso de MockWebServer
5.2 Pruebas de integración
6. Server Site Event con Spring
7. Para ir más allá
8. Puntos clave
Spring y JHipster
1. Introducción
2. Aspectos generales
2.1 JHipster web
2.2 Personalización de la herramienta JHispter
2.3 Niveles de personalización
3. Crear un blueprint
3.1 Blueprint para usar lombok en el dominio
3.2 Ejecución del blueprint local
4. JHipster como herramienta multitecnologías
4.1 Lado del cliente
4.2 Lado del servidor
4.3 Lado de la implementación
4.4 Lado de Spring
5. Estructura del proyecto
5.1 La parte front
5.2 Las líneas principales de la parte back
5.2.1 Spring Boot
5.2.2 La clase de servidor HTTP/servlet
6. JHipster y WebFlux
6.1 Configuración DatabaseConfiguration
6.2 Configuración DateTimeFormatConfiguration
6.3 Configuración LocaleConfiguration
6.4 Configuración ReactorConfiguration
6.5 Configuración SecurityConfiguration
6.6 Configuración WebConfigurer
6.7 Las pruebas
7. Puntos clave
Utilización de GraphQL
1. Introducción
2. El esquema
2.1 La sección Query
2.2 La sección Mutation
3. Integración de GraphQL en Spring
4. La extensión Spring Data Querydsl
5. Controladores GraphQL
6. Autoconfiguración
6.1 Versión HTTP
6.2 El Service GraphQlService
6.3 El RuntimeWiringConfigurer
6.4 Gestión de errores
7. Conclusión
8. Puntos clave
Novedades de Spring
1. El futuro de Spring
2. Soporte de módulos Java
3. Spring Native
4. Proyecto Leyden
5. Spring Observability
6. Obsolescencia programada
índice
Hervé LE MORVAN
En la actualidad, Hervé LE MORVAN es consultor DevOps para las principales firmas de los sectores bancario, seguros y de telecomunicaciones. Durante sus veinte años de experiencia, ha participado principalmente como referente técnico y formador en equipos de investigación y desarrollo (I+D) o arquitectos, y como apoyo al desarrollo de aplicaciones en intervenciones relacionadas con la migración o modernización de sistemas de información. En este sentido, ha estado involucrado en muchos proyectos de migración utilizando la plataforma Spring y conoce perfectamente las expectativas de los equipos en esta área. Toda esta experiencia es la que comparte gustosamente a lo largo de las páginas de este libro.