Professional Documents
Culture Documents
Norberto Fernández
Departamento de Ingeniería Telemática
Universidad Carlos III de Madrid
berto@it.uc3m.es
¿Qué es Spring?
• Framework de código abierto para el desarrollo de
aplicaciones (empresariales) Java
• Origen: Rod Johnson, Expert One-to-One J2EE Design and
Development (Octubre, 2002)
• Alternativa popular a J2EE (EJBs)
• Veremos la versión 2.5
1
Motivación
• Malas experiencias con aplicaciones J2EE
o Complejas,difíciles de probar, pobres prestaciones,...
Motivación
2
Módulos principales de Spring
• Spring Core (Inversión del control (IoC) / Inyección de
dependencias (DI))
• Spring AOP (Programación orientada a aspectos)
• Spring JDBC (Acceso a datos)
• Spring MVC (desarrollo Web según el patrón MVC)
• Spring Remoting (distribución)
• Spring Transaction Abstraction (Gestión de
transacciones)
• Otros: Spring TestContext (pruebas), Spring JMX
(gestión), Spring Security (seguridad), Spring Web Flow
(control de flujos en aplicaciones Web)
Spring Core
Dependency Injection
3
IoC / DI: Introducción
• El núcleo de Spring (Spring Core)
• Inversion of Control (IoC): Hollywood principle
o "Don't call us, we'll call you"
• Los componentes no crean (con new) o buscan (p.ej. con
JNDI) las referencias a otros componentes que necesitan
para realizar su trabajo, sino que simplemente declaran
qué dependencias tienen (fichero de configuración,
anotaciones) y un contenedor les proporciona (inyecta)
estas dependencias
o Dependency Injection (DI)
• El contenedor se encarga de instanciar o localizar los
componentes necesarios e inicializarlos antes de inyectar su
referencia a quién la necesite
4
DI: HolaMundo (I)
Interfaz del servicio:
package spring.core.ejemplos;
5
DI: HolaMundo (III)
Message (interfaz e implementación):
package spring.core.ejemplos;
package spring.core.ejemplos;
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
</beans>
6
DI: HolaMundo (y V)
Main de la aplicación:
package spring.core.ejemplos;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;
Spring AOP
7
AOP: Introducción
• ¿Qué es?
o Aspect Oriented Programming
o Permite combinar cierto código con otro (aspecto) para añadir cierta
funcionalidad al original sin necesidad de modificarlo
o Facilitar la implementación de funcionalidades transversales de una
aplicación
Ej.: logging, control acceso
• Tipos de AOP
o Estática
En tiempo de compilación
Se incluye la información de aspectos en los bytecodes
Problema: recompilar para modificar
o Dinámica
En tiempo de ejecución
Problema: mayor coste computacional
Interrumpir flujo programa para comprobar si hay que ejecutar el aspecto
AOP: Conceptos
• Joinpoint (Punto de cruce)
o Punto concreto del flujo de ejecución
Ej.: Llamada al método hola de una determinada clase
• Advice (Consejo)
o Código que el aspecto ejecuta en un joinpoint
• Pointcuts (Punto de corte)
o Combinación de joinpoints
Ej.: Llamada a cualquier método de una clase concreta
• Aspects (Aspecto)
o Combinación de advice (código) y pointcut (lugar donde se interrumpe el
flujo normal para ejecutarlo)
• Target (Destinatario)
o Objeto cuyo comportamiento modifica el aspecto
• Introduction
o Permite añadir métodos o atributos a clases ya existentes
Servidores de Información 2008/2009 16
8
Spring AOP
• AOP dinámica
• Implementada a través de Proxys
• Más limitada que la de otras librerías (ej.: AspectJ)
o Ej.: Sólo un tipo de joinpoint (invocación a método)
Se puede combinar AspectJ con Spring si se necesita más
• El propio framework utiliza aspectos para implementar otras
funcionalidades
o Ej.: Transacciones
• A continuación veremos el HolaMundo
Target:
package spring.aop.ejemplos;
9
Spring AOP: HolaMundo (II)
Advice:
package spring.aop.ejemplos;
<aop:config>
<aop:aspect ref="helloAdvice">
<aop:pointcut id="sayHelloPointCut" expression="execution(* *.sayHello(..))" />
<aop:before method="antes" pointcut-ref="sayHelloPointCut" />
<aop:after-returning method="despues" pointcut-ref="sayHelloPointCut"
returning="ret" />
</aop:aspect>
</aop:config>
</beans>
Servidores de Información 2008/2009 20
10
Spring AOP: HolaMundo (y IV)
Main de la aplicación:
package spring.aop.ejemplos;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;
11
Acceso a datos
Acceso a datos
• Aspectos a mejorar en el ejemplo:
o SQLException: excepción genérica
o Captura de excepciones para no hacer nada
• ¿Cómo lo mejora Spring?
o Mapeo de SQLException a excepciones específicas
Subclases de org.springframework.dao.DataAccessException
o Uso de unchecked exceptions
DataAccessException es una subclase de java.lang.RuntimeException
Se pueden capturar si se desea, pero no es obligatorio
o Automatiza la gestión de conexiones
Se declara una fuente de datos y Spring la gestiona
No se accede directamente a las conexiones, sino que se utiliza un
JdbcTemplate
Usualmente un org.springframework.jdbc.core.JdbcTemplate
• Veremos acceso a BD relacionales, pero Spring ofrece
integración con librerías ORM como Hibernate
Servidores de Información 2008/2009 24
12
Acceso a datos: HolaMundo (I)
• Vamos a trabajar con una base de datos de
productos:
package spring.jdbc.ejemplos;
13
Acceso a datos: HolaMundo (III)
Implementación del servicio de acceso a datos (I):
package spring.jdbc.ejemplos;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
import org.springframework.dao.DataAccessException;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
...
...
...
14
Acceso a datos: HolaMundo (V)
Implementación del servicio de acceso a datos (y III):
private static final String PRODUCT_SELECT =
"select prod_id, nombre, stock, precio from Productos where prod_id=?";
</beans>
Servidores de Información 2008/2009 30
15
Acceso a datos: HolaMundo (y VII)
Main de la aplicación:
package spring.jdbc.ejemplos;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;
daoSvc.insertarProducto(p);
System.out.println(daoSvc.consultarProducto("id123"));
}
}
Servidores de Información 2008/2009 31
Spring MVC
16
Spring MVC: Funcionamiento (I)
17
Spring MVC: Funcionamiento (y III)
18
Spring MVC: HandlerMapping
• Interfaz HandlerMapping del paquete
org.springframework.web.servlet
• Spring proporciona varias implementaciones. Dos de las
más utilizadas son:
o Paquete: org.springframework.web.servlet.handler
o BeanNameUrlHandlerMapping
Selección por nombre del bean (el nombre coincide con la URL de
invocación). Es el HandlerMapping por defecto
o SimpleUrlHandlerMapping
Se define una tabla que asocia URLs a controladores
Lo veremos en el ejemplo
19
Spring MVC: ViewResolver
• Interfaz ViewResolver del paquete
org.springframework.web.servlet
• Método:
View resolveViewName(String viewName, Locale locale) throws Exception
o UrlBasedViewResolver
No mapeo: el nombre es directamente una referencia a la vista
No implementa soporte para localización
Veremos en el ejemplo el uso de una de sus
subclases: InternalResourceViewResolver 39
20
Spring MVC: HolaMundo (I)
/WEB-INF/web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>2</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Spring MVC Hello World</title>
</head>
<body>
<form method="post" action="greet.do">
Type in your name here: <input type="text" name="name"/>
<input type="submit" value="Go!"/>
</form>
</body>
</html>
21
Spring MVC: HolaMundo (III)
/WEB-INF/dispatcher-servlet.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-2.5.xsd>
</beans>
Servidores de Información 2008/2009 43
import java.util.HashMap;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.AbstractController;
22
Spring MVC: HolaMundo (y V)
/WEB-INF/jsp/greet.jsp
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jstl/core_rt" %>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>JSP Page</title>
</head>
<body>
<h1>Hello <c:out value="${usrName}"></c:out>!</h1>
</body>
</html>
Spring Remoting
23
Spring Remoting: Introducción
• Objetivo: facilitar el desarrollo de aplicaciones distribuidas
o Reducir el código que se necesita para exponer un bean como servicio o
para acceder desde un bean a un servicio remoto
• Spring proporciona mecanismos para:
o Definir service exporter (convertir bean en servicio)
o Definir proxies (acceder a beans remotos como locales)
• En la práctica Spring 2.5 soporta cinco tipos distintos de
arquitecturas distribuidas:
o RMI
o Servicios Web (sólo proxy, no exporter)
o HTTP Invoker (específico de Spring)
o Hessian (Caucho.com, protocolo binario, poco utilizado)
o Burlap (Caucho.com, protocolo XML, poco utilizado)
<wsdl:definitions
targetNamespace="http://platino:8181/axis/services/HolaMundo">
...
<wsdl:service name="HelloWorldServiceImplService">
<wsdl:port binding="impl:HolaMundoSoapBinding" name="HolaMundo">
<wsdlsoap:address
location="http://platino:8181/axis/services/HolaMundo"/>
</wsdl:port>
</wsdl:service>
</wsdl:definitions>
24
Spring Remoting: HolaMundo (II)
Fichero de configuración de Spring:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
<bean id="remoteHelloSrv"
class="org.springframework.remoting.jaxrpc.JaxRpcPortProxyFactoryBean">
<property name="wsdlDocumentUrl"
value="http://platino:8181/axis/services/HolaMundo?wsdl" />
<property name="serviceInterface"
value="spring.remote.ejemplos.HelloWorldService"/>
<property name="portName" value="HolaMundo" />
<property name="serviceName" value="HelloWorldServiceImplService" />
<property name="namespaceUri"
value="http://platino:8181/axis/services/HolaMundo" />
</bean>
</beans>
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;
HelloWorldService remoteHello =
(HelloWorldService)context.getBean("remoteHelloSrv");
System.out.println(remoteHello.sayHello(args[0]));
}
}
25
Gestión de transacciones
• Spring ofrece gestión de transacciones programática o
declarativa
• Cuando se trabaja con una fuente de datos Spring permite
utilizar el soporte de transacciones de la fuente (BD
relacional JDBC, Hibernate, ...)
• Spring es compatible con JTA (Java Transaction API)
o Permite ofrecer soporte a transacciones distribuidas
• Spring no gestiona directamente las transacciones, sino que
hace uso de un gestor de transacciones
(TransactionManager) del que se ofrecen varias
implementaciones:
o org.springframework.jdbc.datasource.DataSourceTransactionManager (JDBC)
o org.springframework.orm.hibernate3.HibernateTransactionManager (Hibernate)
o org.springframework.transaction.jta.JtaTransactionManager (JTA)
o ...
Gestión de transacciones
Ejemplo de (parte de) fichero de configuración de Spring:
<bean id="fooService" class="x.y.service.DefaultFooService"/>
<tx:advice id="txAdvice" transaction-manager="txManager">
<tx:attributes>
<tx:method name="get*" read-only="true"/>
<tx:method name="*"/>
</tx:attributes>
</tx:advice>
<aop:config>
<aop:pointcut id="fooServiceOperation" expression="execution(* x.y.service.FooService.*(..))"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="fooServiceOperation"/>
</aop:config>
<bean id="txManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
26
Referencias
• Rod Johnson; Expert One-to-One J2EE
Design and Development. Ed Wrox,
ISBN: 9780764543852, 2002.
27