Agradecimientos
Sobre el autor
Prefacio
Introducción
Mapa
Contenido Web adicional
¿Quién debería leer este libro?
Convenciones de código
Código fuente
Sobre la ilustración de cubierta
Parte I. Núcleo de Spring
1. Pasar a la acción
¿Qué es Spring?
Módulos de Spring
El contenedor núcleo
Módulo de contexto de aplicación
Módulo AOP de Spring
Abstracción JDBC y el módulo DAO
Módulo de integración de ORM (mapeo objeto-relacional)
Extensiones de gestión de Java (JMX)
Java EE Connector API (JCA)
Marco de trabajo Spring MCV
Spring Portlet MVC
Módulo Web de Spring
Acceso remoto
Java Message Service (JMS)
Puesta en marcha de Spring
Comprender la inyección de dependencia
Inyección de dependencias
Inyección de dependencia en acción
Comprobación del caballero
¿Quién llama a quién?
Desacoplar con interfaces
Dar y recibir
Asignar una búsqueda a un caballero
Ver cómo funciona
Inyección de dependencia en aplicaciones empresariales
Aplicación de la programación orientada a aspectos
Presentación de AOP
AOP en acción
Tejer el aspecto
Resumen
2. Conexión básica de bean
Contener los beans
Presentación de la BeanFactory
Trabajar con un contexto de aplicación
La vida de un bean
Creación de beans
Declarar un bean simple
Inyectar a través de constructores
Inyectar referencias de objeto con constructores
Inyectar en las propiedades del bean
Inyectar valores simples
Referenciar otros beans
Inyectar beans internos
Conectar colecciones
Listas y matrices
Conjuntos
Mapas
Propiedades
No conectar nada (null)
Autoconexión
Los cuatro tipos de autoconexión
Autoconexión por nombre
Autoconexión por tipo
Utilizar la autoconexión por constructor
Detección automática de autoconexión
Autoconexión por defecto
Mezclar la conexión automática y explícita
Autoconectar o no autoconectar
Controlar la creación de beans
Delimitación de bean
Crear beans desde métodos de fábrica
Inicializar y destruir beans
Predeterminar init-method y destroy-method
InitializingBean y DisposableBean
Resumen
3. Conexión avanzada de beans
Declarar beans padres e hijos
Abstraer un tipo de bean base
Obviar propiedades heredadas
Abstraer propiedades comunes
Aplicación de inyección de método
Sustitución básica de método
Uso de la inyección de getter
Inyección de beans no Spring
Registro de editores de propiedad personalizados
Trabajar con beans especiales de Spring
Beans de postprocesamiento
Escritura de un bean de postprocesamiento
Registro de beans de postprocesamiento
Bean postprocesadores propios de Spring
Postprocesamiento de la fábrica de bean
Externalización de propiedades de configuración
Resolución de mensajes de texto
Desacoplar con eventos de aplicación
Publicación de eventos
Detección de eventos
Concienciar beans
Conocerse a uno mismo
Saber dónde vive
Programar beans
Poner la lima en el coco
Programar un bean
Programa Lime en Ruby
Programar Lime en Groovy
Programar Lime en BeanShell
Inyectar propiedades en beans programados
Actualización de beans programados
Escribir beans programados en línea
Resumen
4. Notificaciones a beans
Presentación de AOP
Definición de terminología AOP
Notificación
Punto de unión
Punto de corte
Aspecto
Introducción
Destinatario
Resultante
Weaving
Soporte AOP de Spring
Las notificaciones de Spring se escriben en Java
Spring notifica los objetos en tiempo de ejecución
Spring sólo da soporte a puntos de unión de método
Crear aspectos clásicos de Spring
Creación de notificaciones
Notificar antes
Notificar después del retorno
Notificación después de lanzamiento
Notificar alrededor
Definir puntos de corte y notificaciones
Declarar un punto de corte de una expresión habitual
Combinar un punto de corte con un notificador
Definición de puntos de corte AspectJ
Uso de ProxyFactoryBean
Abstracción de ProxyFactoryBean
Autoproxying
Crear autoproxy para aspectos de Spring
Autoproxying de aspectos @AspectJ
Anotación alrededor de notificación
Declaración de aspectos POJO puros
Inyección de aspectos AspectJ
Resumen
Parte II. Spring empresarial
5. Peticiones a la base de datos
La filosofía de acceso a datos de Spring
Conocer la jerarquía de excepciones de acceso a datos de Spring
Excepciones agnósticas de plataforma de persistencia de Spring
¡Mira, mamá! ¡Sin bloques catch!
Plantillas de acceso a datos
Uso de clases de soporte DAO
Configuración de una fuente de datos
Uso de fuentes de datos JNDI
Fuentes de datos JNDI en Spring 2.0
Utilizar una fuente de datos agrupada
Fuente de datos basada en controlador JDBC
Utilizar JDBC con Spring
Abordar el código JDBC desbocado
Trabajar con plantillas JDBC
Acceso a datos mediante JdbcTemplate
Utilizar parámetros nombrados
Simplificación de JDBC en Java 5
Utilizar las clases de soporte DAO para JDBC
Soporte DAO para parámetros nombrados
DAO de Java 5 simplificado
Integración de Hibernate con Spring
Escoger una versión de Hibernate
Utilizar plantillas de Hibernate
Utilizar archivos de mapeo clásicos de Hibernate
Trabajar con objetos de dominio anotados
Acceso a datos a través de la plantilla de Hibernate
Construir DAO respaldados por Hibernate
Utilizar las sesiones contextuales de Hibernate 3
Spring y Java Persistence API
Utilizar plantillas JPA
Acceso a datos a través de la plantilla JPA
Configurar una fábrica gestor de entidad
Configurar JPA gestionado por la aplicación
Configuración de JPA gestionado por el contenedor
Construir un DAO respaldado en JPA
Spring e IBATIS
Configurar una plantilla cliente de iBATIS
Configurar una SqlMapClientTemplate
Definir mapas SQL de iBATIS
Utilizar la plantilla en un DAO
Construir un DAO respaldado en iBATIS
Duplicación de datos
Configurar una solución de duplicado
Configuración de EHCache
Beans proxy para el duplicado de datos
Limpiar la caché
Declarar un bean proxy interno
Duplicado de datos mediante anotación
Resumen
6. Gestión de transacciones
Comprender las transacciones
Explicación de las transacciones en sólo cuatro palabras
Soporte para gestión de transacciones de Spring
Seleccionar un gestor de transacciones
Transacciones JDBC
Transacciones Hibernate
Transacciones Java Persistence API
Transacciones de Java Data Objects
Transacciones de Java Transaction API
Programar transacciones en Spring
Declarar transacciones
Definición de atributos de transacción
Comportamiento de propagación
Niveles de aislamiento
Sólo lectura
Intervalo de transacción
Reglas de eliminación
Transacciones proxy
Creación de una plantilla proxy de transacción
Declaración de transacciones en Spring 2.0
Definición de transacciones dirigidas por anotaciones
Resumen
7. Seguridad en Spring
Introducción a la seguridad en Spring
¿Qué importa el nombre?
Interceptores de seguridad
Gestores de autenticación
Gestores de decisión de acceso
Gestores ejecutar-como
Gestores tras-invocación
Autenticar usuarios
Configurar un gestor de proveedor
Autenticación contra una base de datos
Utilizar un Dao in-memory
Declarar un DAO JDBC
Trabajar con contraseñas encriptadas
Duplicar información de usuario
Autenticación contra un repositorio LDAP
Autenticación con vinculación LDAP
Autenticación mediante comparación de contraseñas
Declarar el bean de estrategia populator
Controlar el acceso
Votos de decisiones de acceso
Emisión de un voto de decisión de acceso
Manejo de abstenciones de votante
Seguridad en aplicaciones Web
Proxy de filtros de Spring Security
Proxy de filtros servlet
Delegar múltiples filtros
Configuración de proxies para Spring Security
Manejar el contexto de seguridad
Pedir el registro del usuario
Autenticación básica
Autenticación basada en formulario
Manejo de excepciones de seguridad
Manejo de excepciones de autorización
Implementación de seguridad Web
Garantizar un canal seguro
Gestión de decisiones de canal
Seguridad de capa de visualización
Mostrar contenido de forma condicional
Mostrar información de autenticación de usuario
Asegurar invocaciones de método
Creación de un aspecto de seguridad
Asegurar métodos utilizando metadatos
Resumen
8. Servicios remotos basados en Spring y POJO
Visión general del acceso remoto en Spring
Trabajar con RMI
Conexión de servicios RMI
Exportación de servicios RMI
Configurar un servicio RMI en Spring
Servicio remoto con Hessian y Burlap
Acceso a servicios Hessian/Burlap
Mostrar la funcionalidad del bean con Hessian/Burlap
Exportar un servicio Hessian
Configuración del controlador Hessian
Exportar un servicio Burlap
Uso del HttpInvoker de Spring
Acceso a servicios a través de HTTP
Mostrar beans como servicios HTTP
Spring y los servicios Web
Exportar beans como servicios Web utilizando XFire
Configuración de XFireExporter
Configuración de DispatcherServlet
Mapeo de peticiones a XFireExporter
Declaración de servicios Web con anotaciones JSR-181
Mapeo de peticiones a beans anotados con JSR-181
Consumo de servicios Web
Conexión de JaxRpcPortProxyFactoryBean
Mapeo de tipos complejos
Mapeo de matrices
Delegar servicios Web con un cliente XFire
Resumen
9. Construcción de servicios Web contract-first en Spring
Presentación de Spring-WS
Definición del contrato (¡primero!)
Creación de mensajes XML de muestra
Creación del contrato de datos
Manejar mensajes con extremos finales de servicio
Construir un extremo de mensaje de base JDOM
Serialización de carga útil de mensaje
Conectarlo todo
Spring-WS: Visión global
Mapeo de mensajes hacia extremos
Conexión el extremo del servicio
Configuración de un serializador de mensaje
Manejo de excepciones de extremo
Servir archivos WSDL
Utilizar WSDL pre-definido
Implementación del servicio
Consumo de servicios Web de Spring-WS
Trabajar con plantillas de servicio Web
Enviar un mensaje
Utilizar serializadores en el lado del cliente
Utilizar soporte gateway de servicio Web
Resumen
10. Mensajería Spring
Una breve introducción a JMS
Arquitectura de JMS
Modelo de mensajería punto a punto
Modelo de mensajería emisor/suscriptor
Evaluación de las ventajas de JMS
Sin esperas
Orientada a mensajes
Independencia de ubicación
Entrega garantizada
Configuración de ActiveMQ en Spring
Creación de una fábrica de conexión
Declarar un destino de mensaje ActiveMQ
Utilizar JMS con Spring
Afrontar el código JMS desmedido
Trabajar con plantillas JMS
Conexión de JmsTemplate
Envío de mensajes
Establecer un destino predeterminado
Consumo de mensajes
Conversión de mensajes
Envío y recepción de mensajes convertidos
Conexión de un conversor de mensaje
Utilizar el soporte de Spring para clases gateway de JMS
Crear POJO dirigidos por mensajes
Crear un oyente de mensaje
Contenedor de oyente de mensajes
Trabajar con MDP transaccionales
Escribir MPD POJO
Convertir MDP en mensajes
Utilizar RPC basado en mensajes
Introducción a Lingo
Exportar el servicio
Delegar JMS
Conectar JmsProxyFactoryBean
Realizar la llamada
Resumen
11. Spring y Enterprise Java Beans
Conexión de EJB en Spring
Delegar beans de sesión (EJB 2.x)
Declarar proxies de EJB con espacio de nombre JEE en Spring
Declarar beans de sesión EJB 3 en Spring
Conectar EJB a beans de Spring
Desarrollo de EJBs habilitados para Spring (EJB 2.x)
Spring y EJB 3
Introducción de Pitchfork
Primeros pasos con Pitchfork
Inyectar recursos mediante anotación
Declarar interceptores utilizando anotaciones
Resumen
12. Acceso a servicios empresariales
Conectar objetos desde JNDI
Trabajar con JNDI convencional
Inyectar objetos JNDI
Duplicación de objetos JNDI
Carga perezosa de objetos JNDI
Objetos de vuelta atrás
Conectar objetos JNDI en Spring 2
Enviar correos electrónicos
Configuración de un emisor de correos electrónicos
Utilizar una sesión de correo JNDI
Conectar el emisor de correo a un bean de servicio
Construir el mensaje de correo
Programación de tareas
Planificación con Timer de Java
Creación de una tarea programada
Programar la tarea programada
Iniciar el temporizador
Retrasar el inicio del temporizador
Utilizar el programador Quartz
Crear una tarea Quartz
Programar la tarea
Programar una tarea cron
Iniciar la tarea
Invocar métodos según una programación
Gestión de beans de Spring con JMX
Exportar beans de Spring como MBeans
Exponer métodos por nombre
Utilizar interfaces para definir operaciones y atributos de MBean
Trabajar con MBeans basados en metadatos
Manejar colisiones de nombre de objeto MBean
MBeans remotos
Exponer MBeans remotos
Acceso a MBeans remotos
MBeans proxy
Manejar notificaciones
Atender notificaciones
Resumen
Parte III. Spring del lado cliente
13. Manejo de peticiones Web
Primeros pasos con Spring MVC
Un día en la vida de una petición
Configuración de DispatcherServlet
Dividir el contexto de aplicación
Configurar un cargador de contexto
Spring MVC en pocas palabras
Construir el controlador
Introducción de ModelAndView
Configuración del bean controlador
Declarar un resolutor de visualización
Creación del JSP
Ensamblar todo
Mapeo de peticiones a controladores
Utilizar SimpleUrlHandlerMapping
Utilizar ControllerClassNameHandlerMapping
Utilizar metadatos para mapear controladores
Trabajar con múltiples manipuladores de mapeo
Manejo de peticiones con controladores
Procesamiento de comandos
Procesar envío de formularios
Validación de la información de entrada de formulario
Validación mediante Commons Validator
Procesamiento de formularios complejos mediante asistentes
Construcción de un controlador asistente básico
Seguimiento a través de las páginas del formulario
Finalizar el asistente
Cancelar el asistente
Validación una a una de páginas de formulario asistente
Trabajar con controladores throwaway
Manejo de excepciones
Resumen
14. Mostrar vistas Web
Resolución de visualizaciones
Utilizar visualizaciones plantilla
Resolución de beans de visualización
Declarar beans de visualización en un archivo XML independiente
Resolución de visualizaciones desde paquetes de recursos
Elección del resolutor de visualización
Utilizar varios resolutores de visualización
Utilizar plantillas JSP
Vincular datos de formulario
Mostrar mensajes externalizados
Mostrar errores
Diseño de páginas con Tiles
Vistas Tiles
Configuración de Tiles
Resolver vistas Tiles
Crear controladores Tile
Trabajar con alternativas a JSP
Utilizar plantillas Velocity
Definición de la visualización Velocity
Configuración del motor Velocity
Resolución de visualizaciones Velocity
Formatear fechas y números
Exponer atributos de peticiones y sesión
Vincular campos de formulario en Velocity
Trabajar con FreeMarker
Construcción de una vista FreeMarker
Configuración del motor FreeMarker
Resolver visualizaciones FreeMarker
Exponer atributos de petición y sesión
Vincular campos de formulario en FreeMarker
Generación de información de salida no HTML
Producción de hojas de cálculo Excel
Generación de documentos PDF
Desarrollar visualizaciones personalizadas
Resumen
15. Spring Web Flow
Primeros pasos con Spring Web Flow
Instalación de Spring Web Flow
Configuración de FlowController
Configuración de un ejecutor de flujo
Registro de definiciones de flujo
Elementos esenciales de Spring Web Flow
Creación de un flujo
Asentamiento de la infraestructura del flujo
Variables de flujo
Estados inicio y final
Recogida de información de cliente
Petición del número de teléfono del cliente
Búsqueda de datos de cliente
Añadir un nuevo cliente
Construcción del pedido de pizza
Mostrar el pedido
Añadir una pizza al pedido
Completar el pedido
Realización del pago
Envío del pedido
Unos cuantos toques finales
Técnicas avanzadas de flujo Web
Utilizar estados de decisión
Extracción de subflujos y uso de subestados
Creación de un flujo de datos de cliente
Utilizar un subflujo
Integración de Spring Web Flow con otros marcos de trabajo
Jakarta Struts
JavaServer Faces
Resumen
16. Integración con otros marcos de trabajo Web
Utilizar Spring con Struts
Registrar el complemento Spring con Struts
Escribir acciones Struts conscientes de Spring
Delegación en acciones configuradas en Spring
Conexión de acciones en Spring
Implementación de una acción Struts configurada en Spring
¿Qué hay de Struts 2?
Trabajar con Spring en WebWork 2/Struts 2
Integración de Spring con Tapestry
Integración de Spring con Tapestry 3
Abrir beans de Spring en páginas Tapestry
Integración de Spring con Tapestry 4
Enfrentarse a Spring con JSF
Resolución de propiedades gestionadas por JSF
Resolución de beans de Spring
Utilizar beans de Spring en páginas JSF
Exponer el contexto de aplicación en JSF
Habilitar Ajax para aplicaciones en Spring con DWR
Acceso remoto Web directo
Configuración DWR básica
Definición de objetos remotos
Exportar objetos remotos a JavaScript
Llamada a métodos remotos desde JavaScript
Mostrar los resultados
Acceder a beans DWR gestionados por Spring
Utilizar creadores Spring
Utilizar el espacio de nombre de configuración de Spring de DWR
Resumen
Parte IV. Apéndices
Apéndice A. Configuración de Spring
Apéndice B. Comprobación con (y sin) Spring
Índice alfabético
Spring es un marco de código abierto de desarrollo de aplicaciones para la plataforma Java con características que le aportan una vasta funcionalidad. El lanzamiento de Spring 2 ha producido excelentes innovaciones dirigidas a aumentar el rendimiento.
Este libro es un completo manual de referencia y un excelente recurso para cualquier desarrollador interesado en Spring. El material que contiene abarca desde los conceptos básicos hasta consejos avanzados para programadores experimentados, todo ello reforzado con ejemplos basados en modelos de entidades reales.
Comprenderá cómo funciona realmente la programación orientada a aspectos, no sólo como técnica sino como una forma de implementar interacciones en los dominios empresariales que quiera modelar. Hay capítulos dedicados a Spring-WS, JMS, acciones remotas, soporte de script de Spring, así como seguridad, Web Flow, Ajax, transacciones declarativas y persistencia de datos.