Diapositivas que elaboré para impartir el Master en J2EE. Módulo Spring Framework
CAPITULO 1: INTRODUCCION A SPRING FRAMEWORK
1.Introducción
1.1.Arquitectura
1.2.Entorno de desarrollo
CAPITULO 2: CONTENEDOR DE SPRING
2.1. INTRODUCCIÓN
2.2. DEFINICIÓN DE DEPENDENCIA DE INYECCIÓN
2.3. LA FACTORÍA DE BEANS Y EL CONTEXTO DE LA APLICACIÓN
2.3.1. BeanFactory
2.3.2. ApplicationContext
2.3.2.1. Inicializar el contenedor de Beans
2.3.3. Definición de Bean
2.4 Ejemplo IOC e ID con Struts
CAPÍTULO 3-INTEGRACIÓN CON BD.
3.1 Patrón DAO
3.2 Soporte de Spring para JDBC
3.3 DataSource
3.4 Utilización de JDBC con Spring.
CAPITULO 4: PROGRAMACIÓN ORIENTADA A ASPECTOS AOP
4.1 Tipos de advice
4.2 Ejemplo After Returning
4.3 Implementación del ADVICE
4.4 Definición del Advice en ApplicationContext
4.5 Definición del PointCut
4.6 Implementaciones de la intercepción de metodos
4.7 Definir el bean que utilizará el proxy
4.8 Prueba de ejecución
Diapositivas Spring Framework- Javier Oliver Fulguera
1. FRAMEWORK SPRING
1: INTRODUCCION
2: CONTENEDOR DE SPRING
Javier Oliver Fulguera
3: INTEGRACIÓN CON BD.
4: PROGRAMACIÓN ORIENTADA A ASPECTOS AOP
1
@javioliful – www.oliverfulguera.es
2. ÍNDICE
CAPITULO 1: INTRODUCCION
1.Introducción
1.1.Arquitectura
1.2.Entorno de desarrollo
CAPITULO 2: CONTENEDOR DE SPRING
2.1. INTRODUCCIÓN
2.2. DEFINICIÓN DE DEPENDENCIA DE INYECCIÓN
2.3. LA FACTORÍA DE BEANS Y EL CONTEXTO DE LA
APLICACIÓN
2.3.1. BeanFactory
2.3.2. ApplicationContext
2.3.2.1. Inicializar el contenedor de Beans
2.3.3. Definición de Bean
2.4 Ejemplo IOC e ID con Struts
Javier Oliver Fulguera - @javioliful – www.oliverfulguera.es
CAPÍTULO 3-INTEGRACIÓN CON BD.
3.1 Patrón DAO
3.2 Soporte de Spring para JDBC
3.3 DataSource
3.4 Utilización de JDBC con Spring.
CAPITULO 4: PROGRAMACIÓN ORIENTADA A ASPECTOS
AOP
4.1 Tipos de advice
4.2 Ejemplo After Returning
4.3 Implementación del ADVICE
4.4 Definición del Advice en ApplicationContext
4.5 Definición del PointCut
4.6 Implementaciones de la intercepción de metodos
4.7 Definir el bean que utilizará el proxy
4.8 Prueba de ejecución
2
4. Introducción
l Spring Framework: Define la forma de desarrollar aplicaciones J2EE,
dando soporte y simplificando complejidad propia del software corporativo.
l Spring nos facilita la tarea de hacer una aplicación en 3 capas.
¡ Intenta una clara distinción entre las capas de forma
que el codigo sea reutilizable, no haya
dependencias entre capas.
¡ Codigo más legible.
Javier Oliver Fulguera - @javioliful – www.oliverfulguera.es
4
5. Introducción
l
Spring es un framework ligero formada por un conjunto de piezas de
diversa índole: tagLibs, MVC, seguridad, transaccionalidad, AOP, JMX, ...,
integración con Web Services, RMI, EJBs, Hiberante, Ibatis,.... Sin
embargo, su componente principal consiste en un contenedor de
Beans que nos permite, mediante Inversión de Control (IoC), acoplar las
diversas partes de un aplicativo.
l Un bean, en el contexto de Spring, es un objeto que es creado y manejado
por el contenedor Spring. Es importante destacar la diferencia con respecto
al uso clásico de 'bean' en J2EE: en Spring el bean no es una clase que
cumple una serie de normas o restricciones, sino que es un objeto.
l
Toda instancia definida dentro del contenedor de bean es susceptible de:
¡ ser cambiada y/o acoplada, mediante IoC, sin ser intrusivo.
¡ ser sometida a Interceptores AOP. En particular, cabe resaltar la
transaccionalidad, lo que hace que Spring tome más relevancia en la
capa de Negocio.
Javier Oliver Fulguera - @javioliful – www.oliverfulguera.es
5
6. Introducción
l Ventajas:
¡ Es un contenedor ligero, puede trabajar en Tomcat, no como EJB la otra
alternativa, que necesita JBOSS.
¡ No intrusivo puesto que usa IOC, no depende de clases de spring
directamente.
¡ Promueve la reutilización de componentes mediante interfaces, mejorando la
claridad y cantidad del código, ejemplo la capa DAO, es facilmente intercambiar
Hibernate por ibatis.
¡ Gratuito
¡ Fácil de usar.
Javier Oliver Fulguera - @javioliful – www.oliverfulguera.es
6
7. Introducción
¡ Framework vivo, sigue evolucionando.
¡ Se puede usar en cualquier entorno, swing , aplicaciones
web…
¡ Ayuda al uso de AOP, entre ellos el manejo declarativo de
transacciones.
¡ Integración con la mayoría de frameworks y orms.
¡ Tiene su MVC e incluso da la posibilidad de integrarse con
otros.
Javier Oliver Fulguera - @javioliful – www.oliverfulguera.es
7
8. Introducción
¡ Spring propugna ser No intrusivo, es decir, que en el código desarrollado en
nuestro aplicativo no aparecen clases de Spring. Esto es cierto al 99%, pues
únicamente es necesario usar ApplicationContext para invocar nuestros Bean.
¡ Spring además nos dispone de un conjunto de funcionalidades orientadas a
su contenedor: Trasacciones, AOP, seguridad (Acegi) y de un conjunto de
utilidades para integrar Velocity, JMX, JNDI, ...., etc. Todas ellas pueden ser
usadas de forma no intrusiva, si bien Spring nos plantea una segunda opción
intrusiva.
¡ Finalmente, Spring nos dispone de un conjunto de componetes que ya caen en
el rango de ser intrusivos: Spring-MVC y Spring-TagLib.
Javier Oliver Fulguera - @javioliful – www.oliverfulguera.es
8
9. Arquitectura
Cada módulo se corresponde con unas librerías, solo utilizaremos las
que necesitemos, la mayor parte están en spring.jar
Javier Oliver Fulguera - @javioliful – www.oliverfulguera.es
9
10. ARQUITECTURA
1)
Spring core: Parte esencial de spring, proporciona funcionalidad de inyección de
dependencias, como un patrón de acceso a bean , estilo factoría y gestión como
un contenedor de bean.
3)
Spring context: Encargado de cargar el archivo de contexto, a través del
contenedor de servlet, cargandolo en el web.xml.
4)
Spring DAO: Basado en el patrón de diseño DAO, no es necesario crear una
conexión JDBC para cada acceso, hace al código más claro y ayuda a las
transacciones.
5)
Spring AOP: Programación orientada a aspectos, ayuda a eliminar código
duplicado, un ejemplo sería la ejecución de eventos mientras se ejecuta un
método de una clase, su punto fuerte está en el manejo declarativo de
transacciones.
6)
Soporte para la integración de ORM (Hibernate, Ibatis…).
7)
Spring web: Proporciona herramientas para la realización de aplicaciones web,
entre otras la capacidad de integración con framework que implementan el
MVC, struts, jsf..
8)
Spring MVC: Implementación de su propio MVC
Javier Oliver Fulguera - @javioliful – www.oliverfulguera.es
10
11. ENTORNO DE DESARROLLO
l
l
l
l
l
l
Instalar sdk 1.5
Definir variables JAVA_HOME y Path
Descargar IDE: http://www.eclipse.org/europa (wrpp 2.0.1)
Instalar el plugin de spring de: http://springide.org/updatesite/ (core y
extension)
Descargamos las librerías de spring:
http://downloads.sourceforge.net/springframework/springframework-2.5.1-with-dependencies.zip
l
l
l
l
l
Dist:Librerías del framework de spring.
Docs:Documentación.
Libs:Librerías ajenas a spring.
Samples:Ejemplos.
Src:Código fuente.
Javier Oliver Fulguera - @javioliful – www.oliverfulguera.es
11
12. ENTORNO DE DESARROLLO
l
l
l
l
l
l
l
l
l
l
l
Configurar plugin de Tomcat.
Si vamos a trabajar con struts añadir librerías.
Instalar tomcat.
Instalar BD.
Crear un DynamicWebProject.
Añadir naturaleza spring.
Modificamos la carpeta donde salen las clases
compiladas
Importar librerías.
Añadir driver de la BD y elementos de struts.
Crear web.xml
Crear el contexto en Tomcat
Javier Oliver Fulguera - @javioliful – www.oliverfulguera.es
12
13. CAPITULO2: CONTENEDOR DE
SPRING
l
l
l
l
l
l
l
l
2.1. INTRODUCCIÓN
2.2. DEFINICIÓN DE DEPENDENCIA DE INYECCIÓN
2.3. LA FACTORÍA DE BEANS Y EL CONTEXTO DE LA APLICACIÓN
2.3.1. BeanFactory
2.3.2. ApplicationContext
2.3.2.1. Inicializar el contenedor de Beans
2.3.3. Definición de Bean
2.4 Ejemplo IOC e ID con Struts
Javier Oliver Fulguera - @javioliful – www.oliverfulguera.es
13
14. 2.1. INTRODUCCIÓN
l En este tema, nos vamos a centrar en los componentes de los dos módulos
principales que constituyen el núcleo central de Spring (Spring Core y
Spring Context), de los cuales ya realizamos una breve introducción en el
primer capítulo.
l Además, haremos especial hincapié en la utilización del patrón de diseño
Inversión de Control (IoC), y, más concretamente, Dependencia de
Inyección (ID), patrón en el que está basado la lógica de Spring.
Javier Oliver Fulguera - @javioliful – www.oliverfulguera.es
14
15. 2.2. DEFINICIÓN DE DEPENDENCIA DE
INYECCIÓN
l El concepto de Inversión de Control (IoC) es un patrón de diseño que
permite la escritura de un código mucho más limpio y sencillo, facilitando el
desacoplamiento entre los componentes de la arquitectura y la definición
declarativa (frente a la definición programática) de las relaciones entre
ellos.
l El modelo IoC de Dependencia de Inyección se basa en el principio de
Hollywood –“No me llames, ya te llamo yo” –. Es decir, las clases de
una aplicación no necesitan buscar e instanciar las clases de las que
dependen. El control se invierte y es un componente contenedor el que
asume la responsabilidad de la definición de dichas dependencias y la
gestión de las mismas en tiempo de ejecución.
l La utilización de IoC permite la escritura de código mucho más limpio y
sencillo, y facilita el desacoplamiento entre los componentes de la
aplicación.
Javier Oliver Fulguera - @javioliful – www.oliverfulguera.es
15
16. 2.2. DEFINICIÓN DE DEPENDENCIA DE
INYECCIÓN
l
l
l
l
l
Controlador que maneja por ti los objetos.
Crea por ti los objetos, o sea hace el new por ti.
El contenedor resuelve las dependencias por ti.
Facilita el desacoplo del código.
Desacopla el código
Javier Oliver Fulguera - @javioliful – www.oliverfulguera.es
16
17. EJEMPLO IOC
¡
Ejemplo:
l En Struts sin usar ioc:
l
En Struts con ioc:
l
En este último ejemplo no tenemos que instanciar ningun objeto como hacemos en
el ejemplo anterior, además spring se encargará de gestionar las dependencias y
asegurar la disponibilidad del objeto cuando sea necesario
Javier Oliver Fulguera - @javioliful – www.oliverfulguera.es
17
18. DEPENDENCIAS DE INYECCION
l Asimismo, Spring nos facilita varios tipos Dependencia de Inyección. A
continuación, mostramos los más utilizados:
1) Inyección de Interfaces. Esta forma de Dependencia de Inyección es poco
utilizada por los desarrolladores en Spring. En ella, el contenedor es el
encargado de implementar los métodos relativos a esas interfaces en
tiempo de ejecución.
2) Inyección de setter. La Dependencia de Inyección se consigue mediante
los métodos setter de los JavaBeans. Es el método más utilizado por los
desarrolladores de Spring.
3) Inyección en el Constructor. La Dependencia de Inyección se produce al
pasarle las clases que utiliza como parámetros al constructor.
Javier Oliver Fulguera - @javioliful – www.oliverfulguera.es
18
19. DEPENDENCIAS DE INYECCION
l Inyección en el Constructor
l Definicion del bean
Javier Oliver Fulguera - @javioliful – www.oliverfulguera.es
19
20. LA FACTORÍA DE BEANS Y EL
CONTEXTO DE LA APLICACIÓN
l Spring Core es el módulo principal de Spring (en algunos libros lo
podemos encontrar como el núcleo o el corazón de Spring). Por este
motivo, debemos entender que este módulo lo componen los elementos
esenciales de Spring. Dicho módulo proporciona:
1. Funcionalidades de Dependencia de Inyección, mediante la
implementación del patrón de diseño Inversión de Control, y las de
gestión como contenedor de beans.
2. Un patrón de acceso a beans estilo factoría
l El contenedor es el encargado de gestionar las instancias de las clases
configuradas en el framework.
l Spring Context. Este módulo nos proporciona una capa superior al módulo
Core, que nos hace mucho más amigable el trabajo.
Javier Oliver Fulguera - @javioliful – www.oliverfulguera.es
20
21. 2.3.1. BeanFactory
l Hay dos maneras mediante las cuales los clientes pueden utilizar las
funcionalidades que proporciona el Framework de Spring:
¡ La factoría de beans BeanFactory. Es una representación Java del contenedor
de beans utilizado por Spring, la cual aloja la información de todos los beans de
Spring y permite al usuario instanciar dichos beans y utilizarlos.
¡ Utilizar el contexto a través del ApplicationContext. Normalmente, los
desarrolladores no operan con la clase anterior, sino que la factoría de Beans
está encapsulada en el ApplicationContext del módulo Context.
El ApplicationContext se encuentra por encima del BeanFactory y hereda de
ella todas las funcionalidades de ésta.
La factoría de Beans es en realidad quien nos instancia, configura y maneja
los beans.
Javier Oliver Fulguera - @javioliful – www.oliverfulguera.es
21
22. Ejemplo de Bean Factory
l Beans.xml
Javier Oliver Fulguera - @javioliful – www.oliverfulguera.es
22
23. Ejemplo de Bean Factory II
l Una clase cualquiera
Javier Oliver Fulguera - @javioliful – www.oliverfulguera.es
23
24. 2.3.2. ApplicationContext
l Como ya hemos resaltado en el apartado anterior, ApplicactionContext es
una extensión más amigable de BeanFactory.
l El AplicationContext sólo se instancia una vez y es usada por los
programadores para:
¡ Obtener las instancias de los beans.
¡ Acceder a mensajes internacionalizados estilo I18N.
¡ Cargar múltiples contextos.
l applicationcontext-seguridad.xml
l applicationcontext-persistencia.xml
Javier Oliver Fulguera - @javioliful – www.oliverfulguera.es
24
25. 2.3.2.1. Inicializar el Contenedor de
Beans
1. ClassPathXmlApplicationContext. Carga el fichero de contexto desde el
classpath de la aplicación Web, es decir, WEB-INF/classes o WEB-INF/
lib.
ApplicationContext appContext =
new ClassPathXmlApplicationContext("com/prueba/applicationContext.xml");
BeanFactory factory = (BeanFactory) appContext;
Javier Oliver Fulguera - @javioliful – www.oliverfulguera.es
25
26. 2.3.2.1. Inicializar el Contenedor de
Beans
l Cargando el fichero desde cualquier path del servidor
String[] paths = {"/WEB-INF/applicationContext*.xml"};
ApplicationContext appContext =New ClassPathXmlApplicationContext(paths);
BeanFactory factory = (BeanFactory) appContext;
Javier Oliver Fulguera - @javioliful – www.oliverfulguera.es
26
27. 2.3.2.1. Inicializar el Contenedor de
Beans
l FileSystemXmlApplicationContext. Carga el fichero de contexto desde
un fichero del sistema.
ApplicationContext appContext = new FileSystemXmlApplicationContext (path);
BeanFactory factory = (BeanFactory) appContext;
Javier Oliver Fulguera - @javioliful – www.oliverfulguera.es
27
28. 2.3.2.1. Inicializar el Contenedor de
Beans
l XmlWebApplicationContext. Carga el fichero de contexto inicializado por
el ContextLoaderListener. Para cargar el contexto de esta forma,
necesitamos configurar un Listener en el fichero web.xml. El Listener
inicializaría el contexto de la aplicación al arrancar la instancia del servidor
de Aplicaciones.
Web.xml
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
Javier Oliver Fulguera - @javioliful – www.oliverfulguera.es
28
29. 2.3.2.1. Inicializar el Contenedor de
Beans
l Desde el STRUTS-CONFIG-XML. Cargando el pluging de spring
<plug-in className="org.springframework.web.struts.ContextLoaderPlugIn">
<set-property property="contextConfigLocation"
value="/WEB-INF/applicationContext.xml"/>
</plug-in>
Javier Oliver Fulguera - @javioliful – www.oliverfulguera.es
29
30. 2.3.3. Definición de Bean
l Bean: En Spring un Bean es cualquier cosa instanciable.
¡ Un Bean en Spring es susceptible de :
l Ser cambiado y acoplado mediante IOC , sin ser intrusivo.
l Ser sometido AOP, por ejemplo las transacciones.
l No debe cumplir los estándares para los JavaBeans.
Javier Oliver Fulguera - @javioliful – www.oliverfulguera.es
30
31. 2.4.Ejemplo de IOC e ID con Struts
¡
Definición del actión en struts-config.xml
¡
Una vez que en nuestra clase java hemos creado nuestro método set, vamos a
definir nuestro bean en el applicationContext.xml
¡
Ahora debemos definir UsuarioService:
Javier Oliver Fulguera - @javioliful – www.oliverfulguera.es
31
32. 2.4.Ejemplo de IOC e ID con Struts
¡
Y así sucesivamente hasta llegar a la capa de datos
Javier Oliver Fulguera - @javioliful – www.oliverfulguera.es
32
33. 2.4.Ejemplo de IOC e ID con Struts
¡ Inyección por setter
Javier Oliver Fulguera - @javioliful – www.oliverfulguera.es
33
34. CAPÍTULO 3-INTEGRACIÓN CON BD.
l
l
l
l
3.1)Patrón DAO
3.2)Soporte de Spring para JDBC
3.3)DataSource
3.4)Utilización de JDBC con Spring.
Javier Oliver Fulguera - @javioliful – www.oliverfulguera.es
34
35. 3.1)PATRÓN DAO
l Separa la capa de persistencia de la capa de lógica de negocio, es el más
usado por los programadores, aporta:
¡ Reutilización
¡ Claridad
Javier Oliver Fulguera - @javioliful – www.oliverfulguera.es
35
36. 3.2)SOPORTE DE SPRING PARA JDBC
l Paquetes que nos ofrece Spring para trabajar con
JDBC:
¡ org.springframework.jdbc.core
¡ org.springframework.jdbc.datasource
¡ org.springframework.jdbc.object
¡ org.springframework.jdbc.support
Javier Oliver Fulguera - @javioliful – www.oliverfulguera.es
36
37. 3.2)SOPORTE DE SPRING PARA JDBC
l org.springframework.jdbc.core. Son las clases centrales de Spring JDBC. Éstas
son:
¡ • JdbcTemplate
¡ • JdbcDaoSupport
En los apartados finales de este tema mostraremos en qué se basan y cuál es su
empleo.
l org.springframework.jdbc.datasource. Contiene tanto un conjunto de clases que
nos facilitarán el acceso a los datasource, como implementaciones básicas de
datasource.
l org.springframework.jdbc.object. Son las clases que nos proporcionan el soporte
para realizar consultas sobre la base de datos, operaciones de modificaciones y
ejecución de procedimientos almacenados.
l org.springframework.jdbc.support. Se encarga del tratamiento de las
excepciones de tipo SQLException y proporciona soporte para las clases de los
paquetes jdbc.core y jdbc.object.
Javier Oliver Fulguera - @javioliful – www.oliverfulguera.es
37
38. 3.3) DataSource
l Un DataSource es una interfaz que se encuentra en el paquete
javax.sql.DataSource de
J2SDK, la cual se emplea como factoría de objetos Connection.
l Gracias al empleo de un objeto DataSource, nos ahorraremos mucho
tiempo y esfuerzo, y controlaremos mejor los posibles errores que se
producen al dar de alta una conexión.
l Un objeto que usa DataSource puede registrarse por ejemplo:
¡ JNDI
¡ Struts
¡ Spring
l Mediante programación
l Configurara el DataSource en el fichero de configuración.
Javier Oliver Fulguera - @javioliful – www.oliverfulguera.es
38
39. 3.3) DataSource
l Por JNDI.
¡ JNDI es un estándar J2EE para acceder y nominar directorios. Spring nos
proporciona unaclase org.springframework.jndi.JndiObjectFactoryBean que
nos da soporte a esta tecnología. Es ampliamente utilizado en aplicaciones
comerciales.
<bean id="myDataSource"
class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName" value="jdbc/userDB" />
</bean>
Javier Oliver Fulguera - @javioliful – www.oliverfulguera.es
39
40. 3.3) DataSource
l Con Struts
¡ Otra alternativa que proporciona Spring, es la configuración de un DataSource
fuera del contenedor de J2EE, utilizando la clase
org.apache.commons.dbcp.BasicDataSource, que pertenece al proyecto
Apache's Jakarta Commons DBCP. Mediante esta clase, podremos establecer
algunas propiedades adicionales:
<!-- ============= Pool de Conexiones ============== -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
destroymethod="
close">
<property name="driverClassName">
<value>com.mysql.jdbc.Driver</value>
</property>
<property name="url">
<value>jdbc:mysql://localhost:3306/libreria</value>
</property>
<property name="username">
<value>root</value>
</property>
Javier Oliver Fulguera - @javioliful – www.oliverfulguera.es
40
41. 3.3) DataSource
l Usando una clase
¡ Programando una clase, en la cual utilizaremos un objeto de la clase
BasicDataSource, que no es más que una clase que implementa la interfaz
DataSource, y le añadimos los parámetros necesarios, como se muestra a
continuación:
BasicDataSource ds = new BasicDataSource();
ds.setDriverClassName("com.mysql.jdbc.Driver");
ds.setUrl("jdbc:mysql://localhost:3306/libreria");
ds.setUsername("root");
ds.setPassword("");
Javier Oliver Fulguera - @javioliful – www.oliverfulguera.es
41
46. 3.4)Utilización de JDBC con Spring.
l Una vez configurado el DataSource, estudiaremos cómo Spring utiliza el
patrón DAO para trabajar con la capa de persistencia.
1. Definimos una interfaz con todos los métodos de acceso a BD.
2. Definimos una clase que implemente dicha interfaz.
3. Definición del Bean en el archivo de contexto.
l Comenzaremos por observar un fragmento del fichero aplicacióncontext.xml en el cual se define un bean para la capa DAO utilizando
Spring:
Javier Oliver Fulguera - @javioliful – www.oliverfulguera.es
46
47. 3.4)Utilización de JDBC con Spring.
l Usando JDBC como lo conocíamos hasta ahora.
Javier Oliver Fulguera - @javioliful – www.oliverfulguera.es
47
48. 3.4)Utilización de JDBC con Spring.
l Utilizando las clases de Spring para trabajar con JDBC
l
JDBCTemplate
¡ Constructores
l JdbcTemplate j=new JdbcTemplate();
l JdbcTemplate j=new JdbcTemplate(DataSource ds);
l JdbcTemplate j=new JdbcTemplate(DataSource ds, boolean lazyInit);
¡ Operaciones de consulta
l int queryForInt(String sql);
l int queryForInt(String sql, Object [] args);
l long queryForLong(String sql);
l long queryForLong(String sql, Object [] args);
l Object queryForObject(String sql,Class requiredType);
l Object queryForObject(String sql,Class requiredType,Object [] args);
l List queryForList(String sql);
l List queryForList(String sql,Object [] args);
l List queryForList(String sql,ParameterizedRowMapper m);
l int update(String sql);
l int update(String sql, Object [] args);
Javier Oliver Fulguera - @javioliful – www.oliverfulguera.es
48
49. 3.4)Utilización de JDBC con Spring.
l JdbcDaoSupport
¡ No es necesario obtener el DataSource y crear un JdbcTemplate, nos ofrece ya
un getJdbcTemplate().
¡ Maneja excepciones y conexiones
Javier Oliver Fulguera - @javioliful – www.oliverfulguera.es
49
50. 3.4)Utilización de JDBC con Spring.
l Ejemplo: Heredando de JdbcDaoSupport
l Ejemplo: Instanciando JDBCTemplate
Javier Oliver Fulguera - @javioliful – www.oliverfulguera.es
50
51. 3.4)Utilización de JDBC con Spring.
l Para que Spring puede completar los datos de nuestros objetos del modelo,
debemos implementar ParameterizedRowMapper
l E implementar mapRow:
Javier Oliver Fulguera - @javioliful – www.oliverfulguera.es
51
52. 3.4)Utilización de JDBC con Spring.
l Documentación de JDBCTemplate
Javier Oliver Fulguera - @javioliful – www.oliverfulguera.es
52
53. 3.4)Utilización de JDBC con Spring.
Javier Oliver Fulguera - @javioliful – www.oliverfulguera.es
53
54. 3.4)Utilización de JDBC con Spring.
Javier Oliver Fulguera - @javioliful – www.oliverfulguera.es
54
55. Capitulo 4: Programación Orientada a
Aspectos AOP
l AOP paradigma de programación que intenta permitir una adecuada
modularización de las aplicaciones y posibilitar una mejor separación de
conceptos, intenta dar un servicio horizontal, por ejemplo :en vez de hacer
llamadas de log en todos los métodos porqué no se centraliza todo en una
sola funcionalidad.
l AOP nos ayuda a modificar dinámicamente nuestro modelo estático para
incluir el código requerido para cumplir los requerimientos secundarios sin
tener que modificar el modelo estático original (de echo, ni siquiera
necesitaremos tener el código original). Mejor aún, normalmente podremos
tener este código adicional en una única localización en vez de tenerlo
repartido por el modelo existente, como haríamos si estuviéramos usando
sólo OO.
Javier Oliver Fulguera - @javioliful – www.oliverfulguera.es
55
56. Algunas definiciones
l Aspect (Aspecto) es la funcionalidad que se cruza a lo largo de la aplicación (crosscutting) que se va a implementar de forma modular y separada del resto del sistema.
El ejemplo más común y simple de un aspecto es el logging (registro de sucesos)
dentro del sistema, ya que necesariamente afecta a todas las partes del sistema que
generan un suceso.
l Jointpoint (Punto de Cruce) es un punto de ejecución dentro del sistema donde un
aspecto puede ser conectado, como una llamada a un método, el lanzamiento de
una excepción o la modificación de un campo. El código del aspecto será insertado
en el flujo de ejecución de la aplicación para añadir su funcionalidad.
l Advice (Consejo) es la implementación del aspecto, es decir, contiene el código que
implementa la nueva funcionalidad. Se insertan en la aplicación en los Puntos de
Cruce.
l Pointcut (Puntos de Corte) define los Consejos que se aplicarán a cada Punto de
Cruce. Se especifica mediante Expresiones Regulares o mediante patrones de
nombres (de clases, métodos o campos), e incluso dinámicamente en tiempo de
ejecución según el valor de ciertos parámetros.
Javier Oliver Fulguera - @javioliful – www.oliverfulguera.es
56
57. Tipos de advice
l Before:
¡ Interfaz org.springframework.aop.MethodBeforeAdvice
l After Returning
¡ Interfaz org.springframework.aop.AfterReturningAdvice
l Around
¡ Interfaz org.aopalliance.intercept.MethodInterceptor
l After Throwing
¡ Interfaz org.springframework.aop.AfterThrowing
Javier Oliver Fulguera - @javioliful – www.oliverfulguera.es
57
58. Tipos de advice
l Around advice: también conocido como método interceptor, recibe
el control tanto antes como después del punto de ejecución (o joint
point)
l Before advice, recibe el control antes de la ejecución del joint point
l After advice, despues del punto de ejecución
l Throws advice, después del punto de ejecución, si hay excepción
Javier Oliver Fulguera - @javioliful – www.oliverfulguera.es
58
59. Ejemplo After
Returning
l Diagrama de secuencia:
Inicio
(LoginAOP)
proxy
getUsuarios
Advice
(EjemploAfterReturn)
Destino
(UsuarioService)
getUsuarios
El proxy lo crea la factoría de Spring. El objeto proxy es referenciado por el interfaz que referencia
el objeto destino: IUsuariosService
Javier Oliver Fulguera - @javioliful – www.oliverfulguera.es
59
60. Ejemplo After
Returning
l El diagrama de secuencia muestra lo siguiente:
1.
2.
3.
4.
El cliente llama al proxy.
El proxy es creado por una factoria de Spring AOP.
El proxy delega la llamada el objeto destino (target object).
Hasta aquí no se ha producido ningún cambio desde el punto de vista del
comortamiento, el proxy Spring se ha convertido en el intermediario que delega
el comportamiento en el objeto destino. A partir de aquí si que hay un cambio en
el comportamiento: al terminar la llamada al método getUsuarios del objeto
destino, el proxy invoca a EjemploAfterReturn.afterReturning().
Javier Oliver Fulguera - @javioliful – www.oliverfulguera.es
60
61. Ejemplo After
Returning
l 1. Implementación del ADVICE
l 2. Definición del Advice en ApplicationContext
l 3. Definición del PointCut
l 4. Implementaciones de la intercepción de metodos
l 5. Definir el bean que utilizará el proxy
l 6. Prueba de ejecución
Javier Oliver Fulguera - @javioliful – www.oliverfulguera.es
61
62. Ejemplo After
Returning
1. Implementación del ADVICE
l Clase que interceptará la ejecución.
¡ Se implementa AfterReturningAdvice para realizar operaciones después de la
ejecución del método.
Javier Oliver Fulguera - @javioliful – www.oliverfulguera.es
62
63. Ejemplo After
Returning
l El método afterReturning recibe como argumentos:
1. El objeto que retorna el método del objeto destino
2. El método del objeto destino (getUsuarios )
3. Los argumentos enviados al método del objeto
destino (los recursos de nuestro ejemplo)
4. El objeto destino (el bean UsuarioService)
Javier Oliver Fulguera - @javioliful – www.oliverfulguera.es
63
64. 2.
Ejemplo After Returning
Definición del Advice en ApplicationContext
l Como cualquier bean
Javier Oliver Fulguera - @javioliful – www.oliverfulguera.es
64
65. Ejemplo After Returning
3. Definición del PointCut
l El Point Cut o punto de corte, define un patrón para el que se aplicará un
Advice.
l Más patrones:
¡ .*.get.*
¡ .*.set.*
Javier Oliver Fulguera - @javioliful – www.oliverfulguera.es
65
66. 4.
Ejemplo After Returning
Implementaciones de la intercepción de
metodos
l ProxyFactory.
¡ Con una factoria de proxys conseguimos tomar el control absoluto sobre los
pointcuts y los advices que deben ser aplicados y su orden. La forma básica de
crear un proxy AOP en Spring es utilizar
org.springframework.aop.framework.ProxyFactoryBean
Javier Oliver Fulguera - @javioliful – www.oliverfulguera.es
66
67. 5.
Ejemplo After Returning
Definir el bean que utilizará el proxy
l LoginAction de Struts tiene definida una propiedad y tras la ejecución de
cualquiera de sus métodos de ejecutará el código del advice.
Javier Oliver Fulguera - @javioliful – www.oliverfulguera.es
67
68. Ejemplo After
Returning
6. Prueba de ejecución
l Ejecutamos “/loginAOP”:
l Salida por consola:
Estamos en es.curso.videospring.service.aop.EjemploAfteReturn. En afterReturning()
Target: es.curso.videospring.service.impl.UsuariosServiceImp
Argumentos: j(java.lang.String) o(java.lang.String)
Método: getUsuarios
Retorna: es.curso.videospring.capadepersistencia.vo.Usuario :idusuario='1',
nombre='JAVI', apellidos='OLIVER', usuario='j', clave='o', mail='null', teléfono='null'
Javier Oliver Fulguera - @javioliful – www.oliverfulguera.es
68
69. Más tipos de Advice
l Antes y después de la ejecución del método.
Javier Oliver Fulguera - @javioliful – www.oliverfulguera.es
69
70. Capitulo 5: TRANSACCIONES
l Una de las mayores ventajas que ofrece Spring
es el manejo declarativo de transacciones, con
las siguientes ventajas:
¡ Posee un modelo consistente ,integrable con
todos los API’S de persistencia,
JDBC,Hibernate,Ibatis..
¡ Sencillo de usar
¡ Soporte para el manejo declarativo de
transacciones
Javier Oliver Fulguera - @javioliful – www.oliverfulguera.es
70
71. TRANSACCIONES
l Para asegurar la integridad de la base de datos,esta
debe asegurar:
¡ Atomicidad
¡ Aislamiento
¡ Consistencia
¡ Durabilidad
Javier Oliver Fulguera - @javioliful – www.oliverfulguera.es
71
72. TRANSACCIONES
l Tipos de Lectura
¡ Lectura sucia
¡ Lectura no repetible
¡ Lectura fantasma
l Según estos tres tipos de lectura , las
transacciones intenta dar unos niveles de
restricción o aislamiento.
Javier Oliver Fulguera - @javioliful – www.oliverfulguera.es
72
73. TRANSACCIONES
l Niveles de aislamiento de Spring
¡ DEFAULT
¡ SERIALIZABLE
¡ REPETIBLE-READ
¡ READ-COMMITED
¡ READ-UNCOMMITED
Javier Oliver Fulguera - @javioliful – www.oliverfulguera.es
73
74. TRANSACCIONES
l La transaccionalidad en Spring esta basada en AOP.
Para ello nos dispone del interceptor
org.springframework.transaction.interceptor.TransactionProxyFactoryBean
Javier Oliver Fulguera - @javioliful – www.oliverfulguera.es
74
75. TRANSACCIONES
l Tres son las propiedades que necesita TransactionProxyFactoryBean:
l transactionAttributes:
¡ Demarca los límites de la transacción: define que métodos son transaccionales
¡ Define como colabora con otras posibles transacciones anidadas.
l Por ejemplo, los casos mas típicos para consultas de acción:
• PROPAGATION_REQUIRED indica que, si no hay una transacción
iniciada, inicia una.
• PROPAGATION_REQUIRES_NEW crea una transacción nueva, con
independencia de que ya existiera una.
l Los casos mas típicos para las consultas de selección son:
• PROPAGATION_SUPPORTS se asocia a una transacción si existe.
En caso contrario se ejecuta sin transacción.
• PROPAGATION_NEVER. Nunca se ejecuta transaccionalmente. Si
existiera una, produciría una excepción.
¡ Define el nivel de aislamiento de los datos de la transacción respecto de otros
usuarios.
Javier Oliver Fulguera - @javioliful – www.oliverfulguera.es
75
76. TRANSACCIONES
l target: Es el bean sobre el cual se quiere controlar su transaccionalidad.
Típicamente estos serán instancias DAO o servicios. Es necesario que
esten definidos dentro del contenedor para que puedan ser referenciados.
l transactionManager: Manejador de transacciones. Es posible cambiar el
manejador de Transacciones de local a global, sin mas que cambiar la
configuración de Spring.
Javier Oliver Fulguera - @javioliful – www.oliverfulguera.es
76