Spring Boot 3 y Spring Framework 6
¡Despídete de las dependencias, el código lento y la falta de flexibilidad! Con el marco Spring y Spring Boot, crearás sin esfuerzo aplicaciones Java listas para su uso en producción. Comience con lo básico: contenedores para beans gestionados por Spring, módulos del marco Spring y proxies. A continuación, aprenda a conectarse a bases de datos relacionales, implementar Jakarta Persistence, utilizar Spring Data JPA y trabajar con bases de datos NoSQL. ¡Adquiera los conocimientos adecuados para el desarrollo de software moderno con Spring y Java!
- Desarrolle aplicaciones Java empresariales con Spring y Spring Boot.
- Trabajar con contenedores, módulos y proxies de Spring
- Sigue los ejercicios, descarga el código y ve las demostraciones para ampliar tus conocimientos.
Aprenderás sobre:
- Herramientas y marcos:
Aprenda a fondo sobre Spring Boot y el marco Spring. Tanto si desarrolla aplicaciones para sistemas locales, en la nube o híbridos, obtenga instrucciones paso a paso para utilizar todas las herramientas Spring disponibles.
- Fundamentos y temas avanzados:
¿Estás empezando tu primer proyecto? Domina los conceptos básicos, como el almacenamiento en caché, la capa de acceso a datos, los contenedores, los módulos y mucho más. ¿Ya eres un desarrollador con experiencia? Obtén consejos profesionales, ejemplos prácticos y recomendaciones sobre posibles dificultades para crear la aplicación más exitosa posible.
- Desarrollo práctico:
¡Lee y desarrolla al mismo tiempo! Configura tu proyecto Spring Boot siguiendo las instrucciones detalladas y utilizando los ejemplos descargables que acompañan a este libro.
Aspectos Destacados:
- Contenedores
- Módulos
- Apoderados
- Inyección de dependencias
- Almacenamiento en caché
- Servicios web RESTful
- Seguridad
- Implementación
- Bases de datos
- Persistencia en Yakarta
- Datos de primavera JPA
- Spring Web MVC
Ver Tabla de Contenidos Completa
- Prefacio
- ¿Qué es Spring Boot?
- Conocimientos previos y grupo destinatario
- Aplicación de demostración, tareas y soluciones de Date4u
- Organización de los capítulos
- Las secciones *
- ¿Qué versión de Java se utiliza en el libro?
- Software necesario
- Entorno de desarrollo
- Convenciones
- Listado de programas
- Descargas e información en línea
- Acerca del autor
- Comentarios
- 1 Introducción
- 1.1 Historia del marco Spring y su primer proyecto Spring
- 1.1.1 Tareas de la plataforma Java, edición estándar
- 1.1.2 Requisitos empresariales
- 1.1.3 Desarrollo de marcos empresariales Java
- 1.1.4 Rod Johnson desarrolla un marco de trabajo
- 1.1.5 Marco Spring: se requieren muchas configuraciones
- 1.2 Spring Boot
- 1.2.1 Versiones de Spring Boot
- 1.2.2 Periodo de asistencia
- 1.2.3 Alternativas a Spring
- 1.2.4 Configuración de un proyecto Spring Boot
- 1.2.5 Creación de proyectos Spring en entornos de desarrollo
- 1.3 Proyecto Spring Boot: dependencias y Starter
- 1.3.1 Modelo de objetos del proyecto con modelo de objetos del proyecto principal
- 1.3.2 Dependencias como importaciones
- 1.3.3 Hitos y el repositorio de instantáneas
- 1.3.4 Configuración de los procesadores de anotaciones
- 1.3.5 Starter: Dependencias de Spring Initializr
- 1.4 Introducción a las configuraciones y el registro
- 1.4.1 Desactivación del banner
- 1.4.2 API de registro y fachada de registro simple para Java
- 1.5 Resumen
- 2 recipientes para frijoles gestionados por Spring
- 2.1 Contenedor Spring
- 2.1.1 Iniciar contenedor
- 2.1.2 Instanciar SpringApplication
- 2.1.3 SpringApplicationBuilder *
- 2.1.4 ¿Qué hace y qué no hace principalmente (…)?
- 2.1.5 El método run(…) devuelve ConfigurableApplicationContext
- 2.1.6 Métodos de contexto
- 2.2 Estructura del paquete de la aplicación Date4u
- 2.3 Recoger frijoles gestionados por Spring mediante el escaneo de Classpath
- 2.3.1 Llenar el recipiente con frijoles
- 2.3.2 @Componente
- 2.3.3 @Repositorio, @Servicio, @Controlador
- 2.3.4 Controlar el escaneo de la ruta de clases con mayor precisión con @ComponentScan *
- 2.4 Aplicaciones interactivas con Spring Shell
- 2.4.1 Incluir una dependencia de Spring Shell
- 2.4.2 Primera aplicación interactiva
- 2.4.3 Escribir componente Shell: @ShellComponent, @ShellMethod
- 2.5 Inyección de dependencias
- 2.5.1 Crear gráficos de objetos
- 2.5.2 Inversión de control e inyección de dependencias
- 2.5.3 Tipos de inyección
- 2.5.4 PhotoService y PhotoCommands
- 2.5.5 Dependencias múltiples
- 2.5.6 Comportamiento en caso de falta de un componente
- 2.5.7 Dependencia opcional
- 2.5.8 Dependencias cíclicas *
- 2.5.9 Inyectar otras cosas
- 2.6 Clases de configuración y métodos de fábrica
- 2.6.1 Lo que @Component no puede hacer
- 2.6.2 @Configuración y @Bean
- 2.6.3 Inyección de parámetros de un método @Bean
- 2.6.4 @Configuration Bean y Lite Bean
- 2.6.5 Punto de inyección *
- 2.6.6 Métodos estáticos @Bean *
- 2.6.7 @Import y @ImportSelector *
- 2.7 Abstracción y calificaciones
- 2.7.1 Nombre y alias del bean
- 2.7.2 AwtBicubicThumbnail para miniaturas
- 2.7.3 Tipos básicos
- 2.7.4 Proveedor de objetos
- 2.7.5 @Orden y @Orden de configuración automática *
- 2.7.6 Comportamiento en relaciones de herencia seleccionadas *
- 2.8 Ciclo de vida de los frijoles
- 2.8.1 @DependeDe
- 2.8.2 Inicialización diferida (inicialización diferida)
- 2.8.3 Inicialización tradicional de Bean
- 2.8.4 InitializingBean y DisposableBean *
- 2.8.5 Herencia de los métodos del ciclo de vida
- 2.8.6 *Interfaces conscientes *
- 2.8.7 BeanPostProcessor *
- 2.8.8 Registrar beans gestionados por Spring en otro lugar
- 2.8.9 Contextos jerárquicos *
- 2.8.10 Singleton y prototipo sin estado o con estado
- 2.9 Anotaciones de JSR 330, Inyección de dependencias para Java *
- 2.9.1 Dependencia de la anotación estándar JSR 330
- 2.9.2 Asignar anotaciones JSR 330 a Spring
- 2.10 Configuración automática
- 2.10.1 @Condicional y Condición
- 2.10.2 Si, entonces: @CondicionalEn*
- 2.10.3 Activar el registro de depuración de Spring
- 2.10.4 Control individual de las configuraciones automáticas *
- 2.11 Lenguaje de expresión Spring
- 2.11.1 Analizador de expresiones
- 2.11.2 SpEL en la API Spring (Boot)
- 2.12 Resumen
- 3 módulos seleccionados del marco Spring
- 3.1 Clases auxiliares en Spring Framework
- 3.1.1 Componentes de org.springframework
- 3.2 Configuración externa y entorno
- 3.2.1 Código y configuración externa
- 3.2.2 Medio ambiente
- 3.2.3 Inyectar valores con @Value
- 3.2.4 Obtener asignaciones de entorno mediante @Value y ${…}
- 3.2.5 @Value y valores predeterminados
- 3.2.6 Acceso a las configuraciones
- 3.2.7 Propiedades anidadas/jerárquicas
- 3.2.8 Tipos de datos especiales de mapas
- 3.2.9 Enlaces relajados
- 3.2.10 Fuentes de propiedad
- 3.2.11 Definir perfiles de resorte
- 3.2.12 Activar perfiles
- 3.2.13 Beans gestionados por Spring en función del perfil
- 3.3 Al principio y al final
- 3.3.1 CommandLineRunner y ApplicationRunner
- 3.3.2 Al final de la solicitud
- 3.3.3 Salir de programas Java con código de salida *
- 3.4 Manejo de eventos
- 3.4.1 Objetos participantes
- 3.4.2 Eventos de contexto
- 3.4.3 ApplicationListener
- 3.4.4 @EventListener
- 3.4.5 Métodos de las clases de eventos
- 3.4.6 Escribir clases de eventos y reaccionar ante los eventos
- 3.4.7 Un bus de eventos de tipo ApplicationEventPublisher
- 3.4.8 Eventos genéricos utilizando el ejemplo PayloadApplicationEvent
- 3.4.9 Transformaciones de eventos
- 3.4.10 Secuencias por @Orden
- 3.4.11 Filtrar eventos por condiciones
- 3.4.12 Eventos sincrónicos y asincrónicos
- 3.4.13 ApplicationEventMulticaster *
- 3.4.14 Enviar eventos a través de ApplicationContext
- 3.4.15 Adjuntar el oyente a SpringApplication *
- 3.4.16 Escuchador en spring.factories *
- 3.5 Abstracción de recursos con Resource
- 3.5.1 InputStreamSource y Resource
- 3.5.2 Cargar recursos
- 3.5.3 Inyectar recursos mediante @Value
- 3.6 Conversión de tipos con ConversionService
- 3.6.1 Servicio de conversión
- 3.6.2 Servicio de conversión predeterminado y servicio de conversión de aplicaciones
- 3.6.3 ConversionService como bean gestionado por Spring
- 3.6.4 Registre sus propios convertidores con ConverterRegistry
- 3.6.5 Impresora y analizador sintáctico
- 3.6.6 Registro de formateadores
- 3.6.7 DataBinder
- 3.7 Internacionalización *
- 3.7.1 Posibilidades de internacionalización con Java SE
- 3.7.2 MessageSource en Subtipos
- 3.8 Desarrollo basado en pruebas con Spring Boot
- 3.8.1 Entradas relacionadas con pruebas de Spring Initializr
- 3.8.2 Anotación @Test
- 3.8.3 Caso de prueba para la clase FileSystem
- 3.8.4 Prueba de aplicaciones multinivel, intercambio de objetos
- 3.8.5 Marco de simulación Mockito
- 3.8.6 @InjectMocks
- 3.8.7 Verificar el comportamiento
- 3.8.8 Pruebas con ReflectionTestUtils
- 3.8.9 Con o sin soporte de resorte
- 3.8.10 Propiedades de prueba
- 3.8.11 @TestPropertySource
- 3.8.12 @PerfilesActivos
- 3.8.13 Nombrar a un suplente
- 3.8.14 @DirtiesContext
- 3.9 Prueba de segmentos utilizando un ejemplo JSON *
- 3.9.1 JSON
- 3.9.2 Jackson
- 3.9.3 Escribir un objeto Java en JSON
- 3.9.4 Prueba de asignaciones JSON: @JsonTest
- 3.9.5 Asignación con @JsonComponent
- 3.10 Programación *
- 3.10.1 Anotaciones de programación y @EnableScheduling
- 3.10.2 @Programado
- 3.10.3 Desventajas de @Scheduled y alternativas
- 3.11 Tipos de org.springframework.*.[lang|util]
- 3.11.1 Anotaciones org.springframework.lang.*Null*
- 3.11.2 Paquete org.springframework.util
- 3.11.3 Paquete org.springframework.data.util
- 3.12 Resumen
- 4 Representantes seleccionados
- 4.1 Patrón proxy
- 4.1.1 Implementación de proxy en Spring
- 4.1.2 Generar proxies de manera dinámica
- 4.2 Almacenamiento en caché
- 4.2.1 Optimización mediante el almacenamiento en caché
- 4.2.2 Almacenamiento en caché en Spring
- 4.2.3 Componente con el método @Cacheable
- 4.2.4 Utilizar el proxy @Cacheable
- 4.2.5 @Cacheable + Condición
- 4.2.6 @Cacheable + A menos que
- 4.2.7 @CachePut
- 4.2.8 @CacheEvict
- 4.2.9 Especifique sus propios generadores de claves
- 4.2.10 @Configuración de caché
- 4.2.11 Implementaciones de caché
- 4.2.12 Almacenamiento en caché con Caffeine
- 4.2.13 Desactivar el almacenamiento en caché en la prueba
- 4.3 Llamadas asincrónicas
- 4.3.1 Métodos @EnableAsync y @Async
- 4.3.2 Ejemplo con @Async
- 4.3.3 El tipo de retorno CompletableFuture
- 4.4 Ejecutor de tareas *
- 4.4.1 Implementaciones de TaskExecutor
- 4.4.2 Configurar el ejecutor y gestionar las excepciones
- 4.5 Spring y Bean Validation
- 4.5.1 Comprobación de parámetros
- 4.5.2 Validación de Jakarta Bean (JSR 303)
- 4.5.3 Dependencia de Spring Boot Starter Validation
- 4.5.4 Foto con anotaciones de validación de Jakarta Bean
- 4.5.5 Inyectar y probar un validador
- 4.5.6 Spring y las anotaciones de validación Bean
- 4.5.7 Anotaciones de validación Bean para métodos
- 4.5.8 Validación en todas partes utilizando un ejemplo de configuración
- 4.5.9 Validación de la prueba *
- 4.6 Reintento de primavera *
- 4.6.1 Proyecto Spring Retry
- 4.6.2 @Retryable
- 4.6.3 Recurso alternativo con @Recover
- 4.6.4 Plantilla de reintento
- 4.7 Resumen
- 5 Conexión a bases de datos relacionales
- 5.1 Configurar una base de datos H2
- 5.1.1 Breve introducción a la base de datos H2
- 5.1.2 Instalar e iniciar H2
- 5.1.3 Conectarse a la base de datos a través de la consola H2
- 5.1.4 Esquema de la base de datos Date4u
- 5.2 Realizar accesos a bases de datos con Spring
- 5.2.1 Ayudante de primavera
- 5.3 Spring Boot Starter JDBC
- 5.3.1 Incluir el JDBC Starter en el modelo de objetos del proyecto
- 5.3.2 Proporcionar datos de conexión JDBC
- 5.3.3 Inyectar DataSource o JdbcTemplate
- 5.3.4 Agrupación de conexiones
- 5.3.5 Registrar accesos JDBC
- 5.3.6 Paquete JDBC org.springframework.jdbc y sus subpaquetes
- 5.3.7 Excepción de acceso a datos
- 5.3.8 Configuración automática para DataSource *
- 5.3.9 Tratamiento de múltiples bases de datos
- 5.3.10 DataSourceUtils *
- 5.4 JdbcTemplate
- 5.4.1 Ejecutar cualquier SQL: ejecutar(…)
- 5.4.2 Actualizaciones SQL: update(…)
- 5.4.3 Consultar valores individuales: queryForObject(…)
- 5.4.4 Definir un marcador de posición para una instrucción preparada
- 5.4.5 Consultar toda la fila: queryForMap(…)
- 5.4.6 Consultar varias filas con un solo elemento: queryForList(…)
- 5.4.7 Leer varias filas y columnas: queryForList(…)
- 5.5 Tipos de datos para asignar a los resultados
- 5.5.1 RowMapper
- 5.5.2 RowCallbackHandler
- 5.5.3 ResultSetExtractor
- 5.6 Parámetro con nombre JdbcTemplate
- 5.6.1 Relaciones de tipo de *JdbcTemplate
- 5.6.2 Métodos de NamedParameterJdbcTemplate
- 5.6.3 Pasar valores de NamedParameterJdbcTemplate a través de un mapa
- 5.6.4 SqlParameterSource
- 5.6.5 Acceso a objetos subyacentes *
- 5.7 Operaciones por lotes *
- 5.7.1 Métodos por lotes para JdbcTemplate
- 5.7.2 BatchPreparedStatementSetter
- 5.7.3 Métodos por lotes en NamedParameterJdbcTemplate
- 5.7.4 SqlParameterSourceUtils
- 5.7.5 Propiedades de configuración
- 5.8 BLOB y CLOB *
- 5.8.1 SqlLobValue
- 5.8.2 LobHandler y DefaultLobHandler
- 5.8.3 Leer LOB mediante AbstractLobStreamingResultSetExtractor
- 5.9 Subpaquete org.springframework.jdbc.core.simple *
- 5.10 Paquete org.springframework.jdbc.object *
- 5.11 Transacciones
- 5.11.1 Principio ACID
- 5.11.2 Transacciones locales o globales/distribuidas
- 5.11.3 Transacciones JDBC: Auto-Commit
- 5.11.4 Administrador de transacciones de plataforma
- 5.11.5 Plantilla de transacción
- 5.11.6 @Transaccional
- 5.12 Resumen
- 6 Persistencia de Yakarta con Spring
- 6.1 El mundo de los objetos y las bases de datos
- 6.1.1 Transitorio y persistente
- 6.1.2 Asignación de objetos a tablas
- 6.1.3 Bibliotecas Java para mapeo O/R
- 6.2 Persistencia de Yakarta
- 6.2.1 Proveedor de persistencia
- 6.2.2 Proveedor de persistencia Jakarta y JDBC
- 6.2.3 Cobertura de persistencia de Yakarta
- 6.3 Spring Data JPA
- 6.3.1 Incluir Spring Boot Starter Data JPA
- 6.3.2 Configuraciones
- 6.4 Bean de entidad persistente de Jakarta
- 6.4.1 Desarrollar una clase de bean de entidad
- 6.5 API de persistencia de Jakarta
- 6.5.1 Obtener el EntityManager de Spring
- 6.5.2 Buscar un bean de entidad por su clave: find(…)
- 6.5.3 find(…) y getReference(…)
- 6.5.4 Opciones de consulta con EntityManager
- 6.6 Lenguaje de consulta persistente de Jakarta (JPQL)
- 6.6.1 Ejemplo de JPQL con SELECT y FROM
- 6.6.2 Crear y enviar consultas JPQL con createQuery(…)
- 6.6.3 Condiciones en WHERE
- 6.6.4 Parametrizar llamadas JPQL
- 6.6.5 Operadores y funciones JPQL
- 6.6.6 Devoluciones de pedidos con ORDER BY
- 6.6.7 Proyección sobre valores escalares
- 6.6.8 Funciones agregadas
- 6.6.9 Proyección sobre valores múltiples
- 6.6.10 Consultas declarativas con nombre (consultas con nombre)
- 6.7 Llamar a funciones de la base de datos y enviar consultas SQL nativas
- 6.7.1 Funciones de la base de datos de llamadas: FUNCIÓN(…)
- 6.7.2 Utilizar createNativeQuery(…) a través de EntityManager
- 6.7.3 @NamedNativeQuery
- 6.7.4 @NamedNativeQuery con resultSetMapping
- 6.8 Acceso de escritura con EntityManager en transacciones
- 6.8.1 Operaciones transaccionales
- 6.8.2 persistir(…)
- 6.8.3 Transacción de entidad
- 6.8.4 PlatformTransactionManager con JpaTransactionManager
- 6.8.5 @Transaccional
- 6.8.6 Guardar frente a Actualizar
- 6.8.7 eliminar(…)
- 6.8.8 Sincronización o vaciado
- 6.8.9 Consulta con UPDATE y DELETE
- 6.9 Contexto de persistencia y otros controles de transacciones
- 6.9.1 API de persistencia de Jakarta y operaciones de base de datos
- 6.9.2 Estados de un bean de entidad
- 6.10 Metadatos ORM avanzados
- 6.10.1 Enfoques «primero la base de datos» y «primero el código»
- 6.10.2 Establecer el nombre de la tabla mediante @Table
- 6.10.3 Cambiar el nombre de la entidad
- 6.10.4 Atributos persistentes
- 6.10.5 @Básico y @Transitorio
- 6.10.6 Descripción de columnas y @Column
- 6.10.7 Tipos de datos de beans de entidad
- 6.10.8 Tipos de datos de mapas con AttributeConverter
- 6.10.9 Identificación de claves
- 6.10.10 Tipos integrados
- 6.10.11 El bean de entidad hereda propiedades de una superclase
- 6.11 Relaciones entre entidades
- 6.11.1 Asociaciones y tipos de relaciones compatibles
- 6.11.2 Relación 1:1
- 6.11.3 Relaciones bidireccionales
- 6.11.4 Relación 1:n
- 6.11.5 Relaciones n:m *
- 6.12 FetchType: Carga diferida y carga inmediata
- 6.12.1 Enumeración con FetchType
- 6.12.2 Tipo de hibernación: PersistentBag
- 6.12.3 Problema de consulta 1 + N: antipatrón de rendimiento
- 6.13 Cascada
- 6.13.1 Tipo de enumeración CascadeType
- 6.13.2 Establecer CascadeType
- 6.13.3 cascade=REMOVE frente a orphanRemoval=true
- 6.14 Repositorios
- 6.14.1 Capa de acceso a datos
- 6.14.2 Métodos en el repositorio
- 6.14.3 SimpleJpaRepository
- 6.15 Resumen
- 7 Spring Data JPA
- 7.1 ¿Qué tareas realiza Spring Data?
- 7.1.1 ¿Para qué sistemas está disponible Spring Data?
- 7.2 Spring Data Commons: CrudRepository
- 7.2.1 Tipo CrudRepository
- 7.2.2 Repositorios basados en la API de persistencia de Java
- 7.3 Subtipos de CrudRepository
- 7.3.1 ListCrudRepository
- 7.3.2 Subtipos específicos de tecnología [Lista]CrudRepository
- 7.3.3 Métodos seleccionados a través del repositorio
- 7.4 Paginación y clasificación con [List]PagingAndSortingRepository
- 7.4.1 JpaRepository: subtipo de ListPagingAndSortingRepository y ListCrudRepository
- 7.4.2 Tipo de clasificación
- 7.4.3 Ordenar. Ordenar por tipo<T>
- 7.4.4 Pageable y PageRequest
- 7.4.5 Ordenar páginas paginadas
- 7.5 Ejecutor de consultas por ejemplo *
- 7.5.1 Muestra
- 7.5.2 Ejecutor de consultas por ejemplo
- 7.5.3 Muestra en el ejemplo
- 7.5.4 Crear ExampleMatcher
- 7.5.5 Ignorar propiedades
- 7.5.6 Técnicas de comparación de cadenas
- 7.5.7 Establecer reglas individuales con GenericPropertyMatcher
- 7.5.8 Transformador de valor de propiedad
- 7.6 Formular sus propias consultas con @Query
- 7.6.1 Anotación @Query
- 7.6.2 Modificación de operaciones @Query con @Modifying
- 7.6.3 Rellenar el parámetro con una matriz/Varg/colección
- 7.6.4 @Query con proyección JPQL
- 7.6.5 Parámetros de clasificación y paginación
- 7.6.6 Añadir nuevos métodos de consulta
- 7.6.7 Consultas con expresiones del lenguaje de expresiones Spring
- 7.6.8 Uso de @NamedQuery de un bean de entidad
- 7.6.9 Anotación @Query con SQL nativo
- 7.7 Procedimientos almacenados *
- 7.7.1 Definir un procedimiento almacenado en H2
- 7.7.2 Llamada a un procedimiento almacenado mediante una consulta nativa
- 7.7.3 Llamar a un procedimiento almacenado con @Procedure
- 7.8 Métodos de consulta derivados
- 7.8.1 Operaciones CRUD individuales mediante nombres de métodos
- 7.8.2 Estructura de los métodos de consulta derivados
- 7.8.3 Devoluciones de métodos de consulta derivados
- 7.8.4 Métodos de consulta asíncronos
- 7.8.5 Métodos de consulta de transmisión
- 7.8.6 Ventajas y desventajas de los métodos de consulta derivada
- 7.9 API de criterios y JpaSpecificationExecutor
- 7.9.1 API de criterios
- 7.9.2 Especificación de la interfaz funcional
- 7.9.3 Ejecutor de especificaciones Jpa
- 7.9.4 Métodos en JpaSpecificationExecutor
- 7.9.5 Implementaciones de especificaciones
- 7.9.6 Ensamblar instancias de especificaciones
- 7.9.7 Componentes internos *
- 7.9.8 Clases de metamodel
- 7.9.9 Desventajas de utilizar la API de criterios
- 7.10 Alternativas a JDBC Persistencia de Jakarta
- 7.10.1 Querydsl
- 7.10.2 Spring Data JDBC
- 7.11 Buen diseño con repositorios
- 7.11.1 Abstracción a través de la arquitectura en capas
- 7.11.2 ¡Piensa en el principio de segregación de interfaces y en la cebolla!
- 7.11.3 Interfaz de fragmentos
- 7.12 Proyecciones
- 7.12.1 Realice usted mismo las proyecciones
- 7.12.2 Proyecciones en Spring Data
- 7.12.3 Proyección basada en interfaz
- 7.12.4 Proyecciones con expresiones SpEL
- 7.12.5 Proyecciones con métodos predeterminados
- 7.12.6 Proyecciones basadas en clases
- 7.12.7 Proyecciones dinámicas
- 7.13 [Obtenible] FluentQuery *
- 7.14 Auditoría *
- 7.14.1 Auditoría con Spring Data
- 7.14.2 Auditoría con Spring Data JPA
- 7.14.3 AuditorAware para información del usuario
- 7.14.4 Perspectivas: Spring Data Envers
- 7.15 Migración incremental de datos
- 7.15.1 ¡Vivan los datos!
- 7.15.2 Diseño evolutivo de bases de datos
- 7.15.3 Migración incremental de datos con Flyway
- 7.15.4 Flyway en Spring Boot: scripts de migración
- 7.15.5 Migraciones en código Java
- 7.15.6 Migraciones fuera de la primavera
- 7.16 Prueba de la capa de acceso a datos
- 7.16.1 ¿Qué queremos probar?
- 7.16.2 Segmentos de prueba
- 7.16.3 Implementar una base de datos de prueba en memoria
- 7.16.4 Asignar conexión a la base de datos de prueba
- 7.16.5 Crear tablas con scripts de inicialización
- 7.16.6 Proyecto Testcontainers
- 7.16.7 Datos de demostración
- 7.16.8 @Sql y @SqlGroup
- 7.16.9 TestEntityManager
- 7.17 Resumen
- 8 Datos de primavera para bases de datos NoSQL
- 8.1 No solo SQL
- 8.2 MongoDB
- 8.2.1 MongoDB: documentos y colecciones
- 8.2.2 Acerca de MongoDB
- 8.2.3 Instalar e iniciar el servidor MongoDB Community
- 8.2.4 Herramientas GUI para MongoDB
- 8.2.5 Spring Data MongoDB
- 8.2.6 Interfaces de programación de aplicaciones MongoDB
- 8.2.7 Documentos MongoDB
- 8.2.8 Clase MongoTemplate
- 8.2.9 Repositorios MongoDB
- 8.2.10 Prueba de programas MongoDB
- 8.3 Elasticsearch
- 8.3.1 La búsqueda de texto es diferente
- 8.3.2 Apache Lucene
- 8.3.3 Documentos y campos
- 8.3.4 Índice
- 8.3.5 Debilidades de Apache Lucene
- 8.3.6 Archivos adjuntos Lucene: Elasticsearch y Apache Solr
- 8.3.7 Instalar e iniciar Elasticsearch
- 8.3.8 Spring Data Elasticsearch
- 8.3.9 Documentos
- 8.3.10 Repositorio Elasticsearch
- 8.3.11 @DataElasticsearchTest
- 8.4 Resumen
- 9 Red de primavera
- 9.1 Servidor web
- 9.1.1 Servidor web Java
- 9.1.2 Spring Boot Starter Web
- 9.1.3 Utilizar otros servidores web *
- 9.1.4 Ajustar el puerto mediante server.port
- 9.1.5 Servir recursos estáticos
- 9.1.6 WebJars
- 9.1.7 Cifrado de seguridad de la capa de transporte
- 9.2 Generar contenido dinámico
- 9.2.1 La Edad de Piedra: la interfaz de puerta de enlace común
- 9.2.2 Estándar Servlet
- 9.2.3 Programa @WebServlet
- 9.2.4 Debilidades de los servlets
- 9.3 Spring Web MVC
- 9.3.1 Contenedores Spring en aplicaciones web
- 9.3.2 @Controlador
- 9.3.3 @RestController
- 9.3.4 Controlador a [Servicio] a Repositorio
- 9.4 Intercambio de código en caliente
- 9.4.1 Intercambio en caliente de la máquina virtual Java
- 9.4.2 Herramientas de desarrollo de Spring
- 9.5 HTTP
- 9.5.1 Solicitud y respuesta HTTP
- 9.5.2 Configurar un cliente HTTP para probar aplicaciones
- 9.6 Coincidencia de solicitudes
- 9.6.1 @RequestMapping
- 9.6.2 @*Asignación
- 9.6.3 Expresiones de ruta más generales y comparadores de ruta
- 9.6.4 @RequestMapping en Type
- 9.7 Enviar respuesta
- 9.7.1 HttpMessageConverter en la aplicación
- 9.7.2 Conversiones de formato de los retornos del método del controlador
- 9.7.3 Asignación a documentos JSON
- 9.7.4 Entidad de respuesta = Código de estado + Encabezado + Cuerpo
- 9.8 Evaluar solicitud
- 9.8.1 Métodos de controlador con parámetros
- 9.8.2 Transmisión de datos del cliente al controlador
- 9.8.3 Aceptación de datos mediante parámetros
- 9.8.4 Evaluar los parámetros de consulta
- 9.8.5 Parámetros de consulta opcionales
- 9.8.6 Asignar todos los parámetros de consulta
- 9.8.7 Evaluar una variable de ruta
- 9.8.8 Archivo multiparte
- 9.8.9 Evaluar encabezado
- 9.8.10 Subclases HttpEntity RequestEntity y ResponseEntity *
- 9.9 Conversión de tipos de los parámetros
- 9.9.1 Ejemplo de conversor de año y mes
- 9.9.2 @DateTimeFormat y @NumberFormat
- 9.9.3 Asignar parámetros de consulta de mapas y datos de formularios a un bean
- 9.9.4 Registrar sus propios convertidores de tipos
- 9.9.5 Patrón de plantilla URI con expresiones regulares
- 9.10 Manejo de excepciones y mensajes de error
- 9.10.1 Asigne usted mismo excepciones a los códigos de estado
- 9.10.2 Escaladas
- 9.10.3 Propiedades de configuración server.error.*
- 9.10.4 Resolución de excepciones
- 9.10.5 Asignación de excepciones a códigos de estado con @ResponseStatus
- 9.10.6 Excepción de estado de respuesta
- 9.10.7 Manejo de excepciones del controlador local con @ExceptionHandler
- 9.10.8 RFC 7807: «Detalles del problema para las API HTTP»
- 9.10.9 Manejo de excepciones del controlador global con consejos del controlador
- 9.11 API RESTful
- 9.11.1 Principios detrás de REST
- 9.11.2 Implementar puntos finales REST para perfiles
- 9.11.3 Objetos de transferencia de datos
- 9.11.4 Práctica recomendada: no entregue una colección completa de una sola vez.
- 9.11.5 GET y DELETE en recursos individuales
- 9.11.6 POST y PUT con @RequestBody
- 9.11.7 Componentes Uri
- 9.12 Solicitudes web asincrónicas *
- 9.12.1 Las consultas largas bloquean el subproceso de trabajo
- 9.12.2 Escribir de forma asíncrona en la salida
- 9.12.3 Un método de controlador devuelve Callable
- 9.12.4 WebAsyncTask
- 9.12.5 Un método del controlador devuelve DeferredResult
- 9.12.6 StreamingResponseBody
- 9.13 Compatibilidad con Spring Data Web
- 9.13.1 Carga desde el repositorio
- 9.13.2 Tipos de parámetros paginables y ordenables
- 9.13.3 Página Tipo de devolución
- 9.13.4 Predicado Querydsl como tipo de parámetro
- 9.14 Documentación de una API RESTful con OpenAPI
- 9.14.1 Descripción de una API RESTful
- 9.14.2 Especificación OpenAPI
- 9.14.3 ¿De dónde viene el documento OpenAPI?
- 9.14.4 OpenAPI con Spring
- 9.14.5 springdoc-openapi
- 9.14.6 Mejor documentación con anotaciones OpenAPI
- 9.14.7 Generar código Java a partir de un documento OpenAPI
- 9.14.8 Documentación de Spring REST
- 9.15 Prueba de la capa web
- 9.15.1 Prueba de QuoteRestController
- 9.15.2 Anotación @WebMvcTest
- 9.15.3 Escribir un método de prueba con MockMvc
- 9.15.4 Prueba de los puntos finales REST con el servidor
- 9.15.5 Cliente de prueba web
- 9.16 Mejores prácticas al utilizar una API RESTful
- 9.16.1 Validación de beans de Jakarta
- 9.16.2 Identificador de recurso
- 9.16.3 Objetos de transferencia de datos de mapas
- 9.16.4 Control de versiones de los servicios web RESTful
- 9.17 Aplicaciones web seguras con Spring Security
- 9.17.1 La importancia de Spring Security
- 9.17.2 Dependencia de Spring Boot Starter Security
- 9.17.3 Autenticación
- 9.17.4 SecurityContext y SecurityContextHolder
- 9.17.5 Administrador de autenticación
- 9.17.6 Configuración de SpringBootWebSecurity
- 9.17.7 AuthenticationManager y ProviderManager
- 9.17.8 Interfaz UserDetailsService
- 9.17.9 Bean PasswordEncoder gestionado por Spring
- 9.17.10 Filtro de autenticación básica
- 9.17.11 Acceso al usuario
- 9.17.12 Autorización y cookies
- 9.17.13 Autenticación basada en tokens con tokens web JSON
- 9.18 Consumir servicios web RESTful
- 9.18.1 Clases para abordar puntos finales HTTP
- 9.18.2 Un ejemplo de WebClient
- 9.18.3 Clientes de servicios web declarativos
- 9.19 Resumen
- 10 Registro y monitoreo
- 10.1 Registro
- 10.1.1 ¿Por qué crear un protocolo?
- 10.1.2 Grupo de registros
- 10.2 Implementación del registro
- 10.2.1 Conversión a Log4j 2
- 10.2.2 Diseño del patrón de registro
- 10.2.3 Cambiar la configuración de registro
- 10.2.4 Banner
- 10.2.5 Registro en el momento del inicio
- 10.2.6 Prueba del mensaje de registro escrito
- 10.3 Supervisar aplicaciones con Spring Boot Actuator
- 10.3.1 Determinar el estado de salud a través del actuador
- 10.3.2 Activación de los puntos finales
- 10.3.3 Suplementos informativos
- 10.3.4 Parámetros y devoluciones JSON
- 10.3.5 Nuevos puntos finales del actuador
- 10.3.6 ¿Estoy sano?
- 10.3.7 Indicador de salud
- 10.3.8 Métricas
- 10.4 Micrómetro y Prometeo
- 10.4.1 Micrómetro
- 10.4.2 Prometheus: el software
- 10.5 Resumen
- 11 Compilación e implementación
- 11.1 Empaquetar y ejecutar programas Spring Boot
- 11.1.1 Opciones de implementación
- 11.1.2 Ejecutar un programa Spring Boot a través de Maven
- 11.1.3 Empaquetar un programa Spring Boot en un archivo Java
- 11.1.4 Complemento Spring Boot Maven
- 11.2 Aplicaciones Spring en el contenedor OCI
- 11.2.1 Contenedor
- 11.2.2 Instalar y utilizar Docker
- 11.2.3 Inicio, parada, reenvío de puertos y volúmenes de datos de H2
- 11.2.4 Preparar una aplicación Spring Boot Docker
- 11.2.5 Docker Compose
- 11.2.6 Terminar aplicaciones con un punto final de actuador
- 11.3 Resumen
- Migración de Spring Boot 2 a Spring Boot 3
- A.1 Preparación
- A.2 Jakarta EE 9
- A.3 Otras innovaciones
- A.4 Migrador de propiedades de Spring Boot
- A.5 Proyecto Spring Boot Migrator
- A.6 Actualizaciones de dependencias
- B El autor
- Índice
Spring Boot 3 and Spring Framework 6
Say goodbye to dependencies, bogged-down code, and inflexibility! With the Spring framework and Spring Boot, you’ll painlessly create Java applications that are production ready. Start with the basics: containers for Spring-managed beans, Spring framework modules, and proxies. Then learn to connect to relational databases, implement Jakarta Persistence, use Spring Data JPA, and work with NoSQL databases. Get the right know-how for modern software development with Spring and Java!
- Develop enterprise Java applications with Spring and Spring Boot
- Work with Spring containers, modules, and proxies
- Follow along with exercises, downloadable code, and demos to grow your expertise
You'll learn about:
- Tools and Frameworks:
Learn about Spring Boot and the Spring framework in depth. Whether you’re developing applications for on-premise, cloud, or hybrid systems, get step-by-step instructions for using all the available Spring tools.
- Fundamentals and Advanced Topics:
Starting your first project? Master the basics like caching, the data access layer, containers, modules, and more. Already an experienced developer? Get professional tips, practical examples, and advice on possible pitfalls to create the most successful application possible.
- Hands-on Development:
Read and develop at the same time! Set up your Spring Boot project following detailed instructions and using the downloadable examples that accompany this book.
Key Highlights:
- Containers
- Modules
- Proxies
- Dependency injection
- Caching
- RESTful web services
- Security
- Deployment
- Databases
- Jakarta Persistence
- Spring Data JPA
- Spring Web MVC
View Full Table of Contents
- Preface
- What Is Spring Boot?
- Prior Knowledge and Target Group
- Date4u Demo Application, Tasks, and Solutions
- Chapter Organization
- The * Sections
- Which Java Version Is Used in the Book?
- Required Software
- Development Environment
- Conventions
- Program Listings
- Download and Online Information
- About the Author
- Feedback
- 1 Introduction
- 1.1 History of Spring Framework and Your First Spring Project
- 1.1.1 Tasks of Java Platform, Standard Edition
- 1.1.2 Enterprise Requirements
- 1.1.3 Development of Java Enterprise Frameworks
- 1.1.4 Rod Johnson Develops a Framework
- 1.1.5 Spring Framework: Many Configurations Are Required
- 1.2 Spring Boot
- 1.2.1 Spring Boot Versions
- 1.2.2 Support Period
- 1.2.3 Alternatives to Spring
- 1.2.4 Setting Up a Spring Boot Project
- 1.2.5 Building Spring Projects in Development Environments
- 1.3 Spring Boot Project: Dependencies and Starter
- 1.3.1 Project Object Model with Parent Project Object Model
- 1.3.2 Dependencies as Imports
- 1.3.3 Milestones and the Snapshots Repository
- 1.3.4 Configuring Annotation Processors
- 1.3.5 Starter: Dependencies of the Spring Initializr
- 1.4 Getting Started with Configurations and Logging
- 1.4.1 Turning Off the Banner
- 1.4.2 Logging API and Simple Logging Facade for Java
- 1.5 Summary
- 2 Containers for Spring-Managed Beans
- 2.1 Spring Container
- 2.1.1 Start Container
- 2.1.2 Instantiate SpringApplication
- 2.1.3 SpringApplicationBuilder *
- 2.1.4 What main(…) Does and Doesn’t Do
- 2.1.5 The run(…) Method Returns ConfigurableApplicationContext
- 2.1.6 Context Methods
- 2.2 Package Structure of the Date4u Application
- 2.3 Pick Up Spring-Managed Beans through Classpath Scanning
- 2.3.1 Fill Container with Beans
- 2.3.2 @Component
- 2.3.3 @Repository, @Service, @Controller
- 2.3.4 Control Classpath Scanning More Precisely with @ComponentScan *
- 2.4 Interactive Applications with the Spring Shell
- 2.4.1 Include a Spring Shell Dependency
- 2.4.2 First Interactive Application
- 2.4.3 Write Shell Component: @ShellComponent, @ShellMethod
- 2.5 Injecting Dependencies
- 2.5.1 Build Object Graphs
- 2.5.2 Inversion of Control and Dependency Injection
- 2.5.3 Injection Types
- 2.5.4 PhotoService and PhotoCommands
- 2.5.5 Multiple Dependencies
- 2.5.6 Behavior in Case of a Missing Component
- 2.5.7 Optional Dependency
- 2.5.8 Cyclic Dependencies *
- 2.5.9 Inject Other Things
- 2.6 Configuration Classes and Factory Methods
- 2.6.1 What @Component Can’t Do
- 2.6.2 @Configuration and @Bean
- 2.6.3 Parameter Injection of an @Bean Method
- 2.6.4 @Configuration Bean and Lite Bean
- 2.6.5 InjectionPoint *
- 2.6.6 Static @Bean Methods *
- 2.6.7 @Import and @ImportSelector *
- 2.7 Abstraction and Qualifications
- 2.7.1 Bean Name and Alias
- 2.7.2 AwtBicubicThumbnail for Thumbnails
- 2.7.3 Basic Types
- 2.7.4 ObjectProvider
- 2.7.5 @Order and @AutoConfigurationOrder *
- 2.7.6 Behavior in Selected Inheritance Relationships *
- 2.8 Beans Lifecycle
- 2.8.1 @DependsOn
- 2.8.2 Delayed Initialization (Lazy Initialization)
- 2.8.3 Bean Initialization Traditional
- 2.8.4 InitializingBean and DisposableBean *
- 2.8.5 Inheritance of the Lifecycle Methods
- 2.8.6 *Aware Interfaces *
- 2.8.7 BeanPostProcessor *
- 2.8.8 Register Spring-Managed Beans Somewhere Else
- 2.8.9 Hierarchical Contexts *
- 2.8.10 Singleton and Prototype Stateless or Stateful
- 2.9 Annotations from JSR 330, Dependency Injection for Java *
- 2.9.1 Dependency for the JSR 330 Standard Annotation
- 2.9.2 Map JSR 330 Annotations to Spring
- 2.10 Auto-Configuration
- 2.10.1 @Conditional and Condition
- 2.10.2 If, Then: @ConditionalOn*
- 2.10.3 Turn on Spring Debug Logging
- 2.10.4 Controlling Auto-Configurations Individually *
- 2.11 Spring Expression Language
- 2.11.1 ExpressionParser
- 2.11.2 SpEL in the Spring (Boot) API
- 2.12 Summary
- 3 Selected Modules of the Spring Framework
- 3.1 Helper Classes in Spring Framework
- 3.1.1 Components of org.springframework
- 3.2 External Configuration and the Environment
- 3.2.1 Code and External Configuration
- 3.2.2 Environment
- 3.2.3 Inject Values with @Value
- 3.2.4 Get Environment Assignments via @Value and ${…}
- 3.2.5 @Value and Default Values
- 3.2.6 Access to Configurations
- 3.2.7 Nested/Hierarchical Properties
- 3.2.8 Map Special Data Types
- 3.2.9 Relaxed Bindings
- 3.2.10 Property Sources
- 3.2.11 Define Spring Profiles
- 3.2.12 Activate Profiles
- 3.2.13 Spring-Managed Beans Depending on Profile
- 3.3 At the Beginning and End
- 3.3.1 CommandLineRunner and ApplicationRunner
- 3.3.2 At the End of the Application
- 3.3.3 Exit Java Programs with Exit Code *
- 3.4 Event Handling
- 3.4.1 Participating Objects
- 3.4.2 Context Events
- 3.4.3 ApplicationListener
- 3.4.4 @EventListener
- 3.4.5 Methods of the Event Classes
- 3.4.6 Write Event Classes and React to the Events
- 3.4.7 An Event Bus of Type ApplicationEventPublisher
- 3.4.8 Generic Events Using the PayloadApplicationEvent Example
- 3.4.9 Event Transformations
- 3.4.10 Sequences by @Order
- 3.4.11 Filter Events by Conditions
- 3.4.12 Synchronous and Asynchronous Events
- 3.4.13 ApplicationEventMulticaster *
- 3.4.14 Send Events via ApplicationContext
- 3.4.15 Attach Listener to SpringApplication *
- 3.4.16 Listener in spring.factories *
- 3.5 Resource Abstraction with Resource
- 3.5.1 InputStreamSource and Resource
- 3.5.2 Load Resources
- 3.5.3 Inject Resources via @Value
- 3.6 Type Conversion with ConversionService
- 3.6.1 ConversionService
- 3.6.2 DefaultConversionService and ApplicationConversionService
- 3.6.3 ConversionService as Spring-Managed Bean
- 3.6.4 Register Your Own Converters with the ConverterRegistry
- 3.6.5 Printer and Parser
- 3.6.6 FormatterRegistry
- 3.6.7 DataBinder
- 3.7 Internationalization *
- 3.7.1 Possibilities for Internationalization with Java SE
- 3.7.2 MessageSource under Subtypes
- 3.8 Test-Driven Development with Spring Boot
- 3.8.1 Test Related Entries from Spring Initializr
- 3.8.2 Annotation @Test
- 3.8.3 Test Case for the FileSystem Class
- 3.8.4 Test Multitier Applications, Exchange Objects
- 3.8.5 Mocking Framework Mockito
- 3.8.6 @InjectMocks
- 3.8.7 Verify Behavior
- 3.8.8 Testing with ReflectionTestUtils
- 3.8.9 With or Without Spring Support
- 3.8.10 Test Properties
- 3.8.11 @TestPropertySource
- 3.8.12 @ActiveProfiles
- 3.8.13 Appoint Deputy
- 3.8.14 @DirtiesContext
- 3.9 Testing Slices Using a JSON Example *
- 3.9.1 JSON
- 3.9.2 Jackson
- 3.9.3 Write a Java Object in JSON
- 3.9.4 Testing JSON Mappings: @JsonTest
- 3.9.5 Mapping with @JsonComponent
- 3.10 Scheduling *
- 3.10.1 Scheduling Annotations and @EnableScheduling
- 3.10.2 @Scheduled
- 3.10.3 Disadvantages of @Scheduled and Alternatives
- 3.11 Types from org.springframework.*.[lang|util]
- 3.11.1 org.springframework.lang.*Null* Annotations
- 3.11.2 Package org.springframework.util
- 3.11.3 Package org.springframework.data.util
- 3.12 Summary
- 4 Selected Proxies
- 4.1 Proxy Pattern
- 4.1.1 Proxy Deployment in Spring
- 4.1.2 Dynamically Generate Proxies
- 4.2 Caching
- 4.2.1 Optimization through Caching
- 4.2.2 Caching in Spring
- 4.2.3 Component with the @Cacheable Method
- 4.2.4 Use @Cacheable Proxy
- 4.2.5 @Cacheable + Condition
- 4.2.6 @Cacheable + Unless
- 4.2.7 @CachePut
- 4.2.8 @CacheEvict
- 4.2.9 Specify Your Own Key Generators
- 4.2.10 @CacheConfig
- 4.2.11 Cache Implementations
- 4.2.12 Caching with Caffeine
- 4.2.13 Disable the Caching in the Test
- 4.3 Asynchronous Calls
- 4.3.1 @EnableAsync and @Async Methods
- 4.3.2 Example with @Async
- 4.3.3 The CompletableFuture Return Type
- 4.4 TaskExecutor *
- 4.4.1 TaskExecutor Implementations
- 4.4.2 Set Executor and Handle Exceptions
- 4.5 Spring and Bean Validation
- 4.5.1 Parameter Checks
- 4.5.2 Jakarta Bean Validation (JSR 303)
- 4.5.3 Dependency on Spring Boot Starter Validation
- 4.5.4 Photo with Jakarta Bean Validation Annotations
- 4.5.5 Inject and Test a Validator
- 4.5.6 Spring and the Bean Validation Annotations
- 4.5.7 Bean Validation Annotations to Methods
- 4.5.8 Validation Everywhere Using a Configuration Example
- 4.5.9 Test Validation *
- 4.6 Spring Retry *
- 4.6.1 Spring Retry Project
- 4.6.2 @Retryable
- 4.6.3 Fallback with @Recover
- 4.6.4 RetryTemplate
- 4.7 Summary
- 5 Connecting to Relational Databases
- 5.1 Set Up an H2 Database
- 5.1.1 Brief Introduction to the H2 Database
- 5.1.2 Install and Launch H2
- 5.1.3 Connect to the Database via the H2 Console
- 5.1.4 Date4u Database Schema
- 5.2 Realize Database Accesses with Spring
- 5.3 Spring Boot Starter JDBC
- 5.3.1 Include the JDBC Starter in the Project Object Model
- 5.3.2 Provide JDBC Connection Data
- 5.3.3 Inject DataSource or JdbcTemplate
- 5.3.4 Connection Pooling
- 5.3.5 Log JDBC Accesses
- 5.3.6 JDBC org.springframework.jdbc Package and Its Subpackages
- 5.3.7 DataAccessException
- 5.3.8 Auto-Configuration for DataSource *
- 5.3.9 Addressing Multiple Databases
- 5.3.10 DataSourceUtils *
- 5.4 JdbcTemplate
- 5.4.1 Execute Any SQL: execute(…)
- 5.4.2 SQL Updates: update(…)
- 5.4.3 Query Individual Values: queryForObject(…)
- 5.4.4 Define a Placeholder for a PreparedStatement
- 5.4.5 Query Whole Row: queryForMap(…)
- 5.4.6 Query Multiple Rows with One Element: queryForList(…)
- 5.4.7 Read Multiple Rows and Columns: queryForList(…)
- 5.5 Data Types for Mapping to Results
- 5.5.1 RowMapper
- 5.5.2 RowCallbackHandler
- 5.5.3 ResultSetExtractor
- 5.6 NamedParameterJdbcTemplate
- 5.6.1 Type Relationships of *JdbcTemplate
- 5.6.2 Methods of the NamedParameterJdbcTemplate
- 5.6.3 Pass Values of NamedParameterJdbcTemplate through a Map
- 5.6.4 SqlParameterSource
- 5.6.5 Access to Underlying Objects *
- 5.7 Batch Operations *
- 5.7.1 Batch Methods for JdbcTemplate
- 5.7.2 BatchPreparedStatementSetter
- 5.7.3 Batch Methods at NamedParameterJdbcTemplate
- 5.7.4 SqlParameterSourceUtils
- 5.7.5 Configuration Properties
- 5.8 BLOBs and CLOBs *
- 5.8.1 SqlLobValue
- 5.8.2 LobHandler and DefaultLobHandler
- 5.8.3 Read LOBs via AbstractLobStreamingResultSetExtractor
- 5.9 Subpackage org.springframework.jdbc.core.simple *
- 5.10 Package org.springframework.jdbc.object *
- 5.11 Transactions
- 5.11.1 ACID Principle
- 5.11.2 Local or Global/Distributed Transactions
- 5.11.3 JDBC Transactions: Auto-Commit
- 5.11.4 PlatformTransactionManager
- 5.11.5 TransactionTemplate
- 5.11.6 @Transactional
- 5.12 Summary
- 6 Jakarta Persistence with Spring
- 6.1 World of Objects and Databases
- 6.1.1 Transient and Persistent
- 6.1.2 Mapping Objects to Tables
- 6.1.3 Java Libraries for O/R Mapping
- 6.2 Jakarta Persistence
- 6.2.1 Persistence Provider
- 6.2.2 Jakarta Persistence Provider and JDBC
- 6.2.3 Jakarta Persistence Coverage
- 6.3 Spring Data JPA
- 6.3.1 Include Spring Boot Starter Data JPA
- 6.3.2 Configurations
- 6.4 Jakarta Persistence Entity Bean
- 6.4.1 Develop an Entity Bean Class
- 6.5 Jakarta Persistence API
- 6.5.1 Getting the EntityManager from Spring
- 6.5.2 Search an Entity Bean by Its Key: find(…)
- 6.5.3 find(…) and getReference(…)
- 6.5.4 Query Options with the EntityManager
- 6.6 Jakarta Persistence Query Language (JPQL)
- 6.6.1 JPQL Example with SELECT and FROM
- 6.6.2 Build and Submit JPQL Queries with createQuery(…)
- 6.6.3 Conditions in WHERE
- 6.6.4 Parameterize JPQL Calls
- 6.6.5 JPQL Operators and Functions
- 6.6.6 Order Returns with ORDER BY
- 6.6.7 Projection on Scalar Values
- 6.6.8 Aggregate Functions
- 6.6.9 Projection on Multiple Values
- 6.6.10 Named Declarative Queries (Named Queries)
- 6.7 Call Database Functions and Send Native SQL Queries
- 6.7.1 Call Database Functions: FUNCTION(…)
- 6.7.2 Use createNativeQuery(…) via EntityManager
- 6.7.3 @NamedNativeQuery
- 6.7.4 @NamedNativeQuery with resultSetMapping
- 6.8 Write Access with the EntityManager in Transactions
- 6.8.1 Transactional Operations
- 6.8.2 persist(…)
- 6.8.3 EntityTransaction
- 6.8.4 PlatformTransactionManager with JpaTransactionManager
- 6.8.5 @Transactional
- 6.8.6 Save versus Update
- 6.8.7 remove(…)
- 6.8.8 Synchronization or Flush
- 6.8.9 Query with UPDATE and DELETE
- 6.9 Persistence Context and Other Transaction Controls
- 6.9.1 Jakarta Persistence API and Database Operations
- 6.9.2 States of an Entity Bean
- 6.10 Advanced ORM Metadata
- 6.10.1 Database-First and Code-First Approaches
- 6.10.2 Set the Table Name via @Table
- 6.10.3 Change the @Entity Name
- 6.10.4 Persistent Attributes
- 6.10.5 @Basic and @Transient
- 6.10.6 Column Description and @Column
- 6.10.7 Entity Bean Data Types
- 6.10.8 Map Data Types with AttributeConverter
- 6.10.9 Key Identification
- 6.10.10 Embedded Types
- 6.10.11 Entity Bean Inherits Properties from a Superclass
- 6.11 Relationships between Entities
- 6.11.1 Supported Associations and Relationship Types
- 6.11.2 1:1 Relationship
- 6.11.3 Bidirectional Relationships
- 6.11.4 1:n Relationship
- 6.11.5 n:m Relationships *
- 6.12 FetchType: Lazy and Eager Loading
- 6.12.1 Enumeration with FetchType
- 6.12.2 Hibernate Type: PersistentBag
- 6.12.3 1 + N Query Problem: Performance Anti-Pattern
- 6.13 Cascading
- 6.13.1 CascadeType Enumeration Type
- 6.13.2 Set CascadeType
- 6.13.3 cascade=REMOVE versus orphanRemoval=true
- 6.14 Repositories
- 6.14.1 Data Access Layer
- 6.14.2 Methods in the Repository
- 6.14.3 SimpleJpaRepository
- 6.15 Summary
- 7 Spring Data JPA
- 7.1 What Tasks Does Spring Data Perform?
- 7.1.1 For Which Systems Is Spring Data Available?
- 7.2 Spring Data Commons: CrudRepository
- 7.2.1 CrudRepository Type
- 7.2.2 Java Persistence API–Based Repositories
- 7.3 Subtypes of CrudRepository
- 7.3.1 ListCrudRepository
- 7.3.2 Technology-Specific [List]CrudRepository Subtypes
- 7.3.3 Selected Methods via Repository
- 7.4 Paging and Sorting with [List]PagingAndSortingRepository
- 7.4.1 JpaRepository: Subttype of ListPagingAndSortingRepository and ListCrudRepository
- 7.4.2 Sort Type
- 7.4.3 Sort.TypedSort<T>
- 7.4.4 Pageable and PageRequest
- 7.4.5 Sort Paginated Pages
- 7.5 QueryByExampleExecutor *
- 7.5.1 Sample
- 7.5.2 QueryByExampleExecutor
- 7.5.3 Sample into the Example
- 7.5.4 Build ExampleMatcher
- 7.5.5 Ignore Properties
- 7.5.6 Set String Comparison Techniques
- 7.5.7 Set Individual Rules with GenericPropertyMatcher
- 7.5.8 PropertyValueTransformer
- 7.6 Formulate Your Own Queries with @Query
- 7.6.1 @Query Annotation
- 7.6.2 Modifying @Query Operations with @Modifying
- 7.6.3 Fill IN Parameter by Array/Varg/Collection
- 7.6.4 @Query with JPQL Projection
- 7.6.5 Sort and Pageable Parameters
- 7.6.6 Add New Query Methods
- 7.6.7 Queries with Spring Expression Language Expressions
- 7.6.8 Using the @NamedQuery of an Entity Bean
- 7.6.9 @Query Annotation with Native SQL
- 7.7 Stored Procedures *
- 7.7.1 Define a Stored Procedure in H2
- 7.7.2 Calling a Stored Procedure via a Native Query
- 7.7.3 Call a Stored Procedure with @Procedure
- 7.8 Derived Query Methods
- 7.8.1 Individual CRUD Operations via Method Names
- 7.8.2 Structure of the Derived Query Methods
- 7.8.3 Returns from Derived Query Methods
- 7.8.4 Asynchronous Query Methods
- 7.8.5 Streaming Query Methods
- 7.8.6 Advantages and Disadvantages of Derived Query Methods
- 7.9 Criteria API and JpaSpecificationExecutor
- 7.9.1 Criteria API
- 7.9.2 Functional Interface Specification
- 7.9.3 JpaSpecificationExecutor
- 7.9.4 Methods in JpaSpecificationExecutor
- 7.9.5 Specification Implementations
- 7.9.6 Assemble Specification Instances
- 7.9.7 Internals *
- 7.9.8 Metamodel Classes
- 7.9.9 Cons of Using the Criteria API
- 7.10 Alternatives to JDBC Jakarta Persistence
- 7.10.1 Querydsl
- 7.10.2 Spring Data JDBC
- 7.11 Good Design with Repositories
- 7.11.1 Abstractions through the Onion Architecture
- 7.11.2 Think of the Interface Segregation Principle and the Onion!
- 7.11.3 Fragment Interface
- 7.12 Projections
- 7.12.1 Perform Projections Yourself
- 7.12.2 Projections in Spring Data
- 7.12.3 Interface-Based Projection
- 7.12.4 Projections with SpEL Expressions
- 7.12.5 Projections with Default Methods
- 7.12.6 Class-Based Projections
- 7.12.7 Dynamic Projections
- 7.13 [Fetchable]FluentQuery *
- 7.14 Auditing *
- 7.14.1 Auditing with Spring Data
- 7.14.2 Auditing with Spring Data JPA
- 7.14.3 AuditorAware for User Information
- 7.14.4 Outlook: Spring Data Envers
- 7.15 Incremental Data Migration
- 7.15.1 Long Live the Data
- 7.15.2 Evolutionary Database Design
- 7.15.3 Incremental Data Migration with Flyway
- 7.15.4 Flyway in Spring Boot: Migration Scripts
- 7.15.5 Migrations in Java Code
- 7.15.6 Flyway Migrations outside Spring
- 7.16 Test the Data Access Layer
- 7.16.1 What Do We Want to Test?
- 7.16.2 Test Slices
- 7.16.3 Deploy an In-Memory Test Database
- 7.16.4 Assign Connection to the Test Database
- 7.16.5 Build Tables with Initialization Scripts
- 7.16.6 Testcontainers Project
- 7.16.7 Demo Data
- 7.16.8 @Sql and @SqlGroup
- 7.16.9 TestEntityManager
- 7.17 Summary
- 8 Spring Data for NoSQL Databases
- 8.1 Not Only SQL
- 8.2 MongoDB
- 8.2.1 MongoDB: Documents and Collections
- 8.2.2 About MongoDB
- 8.2.3 Install and Start the MongoDB Community Server
- 8.2.4 GUI Tools for MongoDB
- 8.2.5 Spring Data MongoDB
- 8.2.6 MongoDB Application Programming Interfaces
- 8.2.7 MongoDB Documents
- 8.2.8 MongoTemplate Class
- 8.2.9 MongoDB Repositories
- 8.2.10 Test MongoDB Programs
- 8.3 Elasticsearch
- 8.3.1 Text Search Is Different
- 8.3.2 Apache Lucene
- 8.3.3 Documents and Fields
- 8.3.4 Index
- 8.3.5 Weaknesses of Apache Lucene
- 8.3.6 Lucene Attachments: Elasticsearch and Apache Solr
- 8.3.7 Install and Launch Elasticsearch
- 8.3.8 Spring Data Elasticsearch
- 8.3.9 Documents
- 8.3.10 ElasticsearchRepository
- 8.3.11 @DataElasticsearchTest
- 8.4 Summary
- 9 Spring Web
- 9.1 Web Server
- 9.1.1 Java Web Server
- 9.1.2 Spring Boot Starter Web
- 9.1.3 Use Other Web Servers *
- 9.1.4 Adjust Port via server.port
- 9.1.5 Serve Static Resources
- 9.1.6 WebJars
- 9.1.7 Transport Layer Security Encryption
- 9.2 Generate Dynamic Content
- 9.2.1 Stone Age: The Common Gateway Interface
- 9.2.2 Servlet Standard
- 9.2.3 Program @WebServlet
- 9.2.4 Weaknesses of Servlets
- 9.3 Spring Web MVC
- 9.3.1 Spring Containers in Web Applications
- 9.3.2 @Controller
- 9.3.3 @RestController
- 9.3.4 Controller to [Service] to Repository
- 9.4 Hot Code Swapping
- 9.4.1 Hot Swapping of the Java Virtual Machine
- 9.4.2 Spring Developer Tools
- 9.5 HTTP
- 9.5.1 HTTP Request and Response
- 9.5.2 Set Up an HTTP Client for Testing Applications
- 9.6 Request Matching
- 9.6.1 @RequestMapping
- 9.6.2 @*Mapping
- 9.6.3 More General Path Expressions and Path Matchers
- 9.6.4 @RequestMapping on Type
- 9.7 Send Response
- 9.7.1 HttpMessageConverter in the Application
- 9.7.2 Format Conversions of Handler Method Returns
- 9.7.3 Mapping to JSON Documents
- 9.7.4 ResponseEntity = Statuscode + Header + Body
- 9.8 Evaluate Request
- 9.8.1 Handler Methods with Parameters
- 9.8.2 Data Transmission from Client to Controller
- 9.8.3 Data Acceptance via Parameters
- 9.8.4 Evaluate Query Parameters
- 9.8.5 Optional Query Parameters
- 9.8.6 Map All Query Parameters
- 9.8.7 Evaluate a Path Variable
- 9.8.8 MultipartFile
- 9.8.9 Evaluate Header
- 9.8.10 HttpEntity Subclasses RequestEntity and ResponseEntity *
- 9.9 Type Conversion of the Parameters
- 9.9.1 YearMonth Converter Example
- 9.9.2 @DateTimeFormat and @NumberFormat
- 9.9.3 Map Query Parameters and Form Data to a Bean
- 9.9.4 Register Your Own Type Converters
- 9.9.5 URI Template Pattern with Regular Expressions
- 9.10 Exception Handling and Error Message
- 9.10.1 Map Exceptions to Status Codes Yourself
- 9.10.2 Escalates
- 9.10.3 Configuration Properties server.error.*
- 9.10.4 Exception Resolver
- 9.10.5 Map Exception to Status Code with @ResponseStatus
- 9.10.6 ResponseStatusException
- 9.10.7 Local Controller Exception Handling with @ExceptionHandler
- 9.10.8 RFC 7807: “Problem Details for HTTP APIs”
- 9.10.9 Global Controller Exception Handling with Controller Advice
- 9.11 RESTful API
- 9.11.1 Principles behind REST
- 9.11.2 Implement REST Endpoints for Profiles
- 9.11.3 Data Transfer Objects
- 9.11.4 Best Practice: Don’t Deliver a Complete Collection at Once
- 9.11.5 GET and DELETE on Individual Resources
- 9.11.6 POST and PUT with @RequestBody
- 9.11.7 UriComponents
- 9.12 Asynchronous Web Requests *
- 9.12.1 Long Queries Block the Worker Thread
- 9.12.2 Write Asynchronously to the Output
- 9.12.3 A Handler Method Returns Callable
- 9.12.4 WebAsyncTask
- 9.12.5 A Handler Method Returns DeferredResult
- 9.12.6 StreamingResponseBody
- 9.13 Spring Data Web Support
- 9.13.1 Loading from the Repository
- 9.13.2 Pageable and Sort as Parameter Types
- 9.13.3 Return Type Page
- 9.13.4 Querydsl Predicate as a Parameter Type
- 9.14 Documentation of a RESTful API with OpenAPI
- 9.14.1 Description of a RESTful API
- 9.14.2 OpenAPI Specification
- 9.14.3 Where Does the OpenAPI Document Come From?
- 9.14.4 OpenAPI with Spring
- 9.14.5 springdoc-openapi
- 9.14.6 Better Documentation with OpenAPI Annotations
- 9.14.7 Generate Java Code from an OpenAPI Document
- 9.14.8 Spring REST Docs
- 9.15 Testing the Web Layer
- 9.15.1 Test QuoteRestController
- 9.15.2 Annotation @WebMvcTest
- 9.15.3 Writing a Test Method with MockMvc
- 9.15.4 Test REST Endpoints with the Server
- 9.15.5 WebTestClient
- 9.16 Best Practices When Using a RESTful API
- 9.16.1 Jakarta Bean Validation
- 9.16.2 Resource ID
- 9.16.3 Map Data Transfer Objects
- 9.16.4 Versioning of RESTful Web Services
- 9.17 Secure Web Applications with Spring Security
- 9.17.1 The Importance of Spring Security
- 9.17.2 Dependency on Spring Boot Starter Security
- 9.17.3 Authentication
- 9.17.4 SecurityContext and SecurityContextHolder
- 9.17.5 AuthenticationManager
- 9.17.6 SpringBootWebSecurityConfiguration
- 9.17.7 AuthenticationManager and ProviderManager
- 9.17.8 UserDetailsService Interface
- 9.17.9 Spring-Managed Bean PasswordEncoder
- 9.17.10 BasicAuthenticationFilter
- 9.17.11 Access to the User
- 9.17.12 Authorization and the Cookie
- 9.17.13 Token-Based Authentication with JSON Web Tokens
- 9.18 Consume RESTful Web Services
- 9.18.1 Classes for Addressing HTTP Endpoints
- 9.18.2 A WebClient Example
- 9.18.3 Declarative Web Service Clients
- 9.19 Summary
- 10 Logging and Monitoring
- 10.1 Logging
- 10.1.1 Why Create a Protocol?
- 10.1.2 Log Group
- 10.2 Logging Implementation
- 10.2.1 Conversion to Log4j 2
- 10.2.2 Logging Pattern Layout
- 10.2.3 Change the Logging Configuration
- 10.2.4 Banner
- 10.2.5 Logging at Start Time
- 10.2.6 Testing Written Log Message
- 10.3 Monitor Applications with Spring Boot Actuator
- 10.3.1 Determine the Health Status via the Actuator
- 10.3.2 Activation of the Endpoints
- 10.3.3 Info Supplements
- 10.3.4 Parameters and JSON Returns
- 10.3.5 New Actuator Endpoints
- 10.3.6 Am I Healthy?
- 10.3.7 HealthIndicator
- 10.3.8 Metrics
- 10.4 Micrometer and Prometheus
- 10.4.1 Micrometer
- 10.4.2 Prometheus: The Software
- 10.5 Summary
- 11 Build and Deployment
- 11.1 Package and Run Spring Boot Programs
- 11.1.1 Deployment Options
- 11.1.2 Launching a Spring Boot Program via Maven
- 11.1.3 Packing a Spring Boot Program into a Java Archive
- 11.1.4 spring-boot-maven-plugin
- 11.2 Spring Applications in the OCI Container
- 11.2.1 Container
- 11.2.2 Install and Use Docker
- 11.2.3 H2 Start, Stop, Port Forwarding, and Data Volumes
- 11.2.4 Prepare a Spring Boot Docker Application
- 11.2.5 Docker Compose
- 11.2.6 Terminate Applications with an Actuator Endpoint
- 11.3 Summary
- A Migration from Spring Boot 2 to Spring Boot 3
- A.1 Preparation
- A.2 Jakarta EE 9
- A.3 Other Innovations
- A.4 Spring-Boot-Properties-Migrator
- A.5 Spring Boot Migrator Project
- A.6 Dependency Upgrades
- B The Author
- Index