Está en la página 1de 27

Introduccin a Spring

Norberto Fernndez Departamento de Ingeniera Telemtica Universidad Carlos III de Madrid berto@it.uc3m.es

Servidores de Informacin 2008/2009

Qu es Spring?
Framework de cdigo 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 versin 2.5

Servidores de Informacin 2008/2009

Fuente: Dzone

Motivacin
Malas experiencias con aplicaciones J2EE o Complejas,difciles de probar, pobres prestaciones,... Crticas al uso de EJBs:
o

Rod Johnson, J2EE development without EJB (2004) Complejidad (descriptores, implementacin interfaces,...) y baja productividad del programador Modelo remoto basado slo en RMI Muchas aplicaciones no necesitan componentes remotos Difciles de depurar (dependencias con contenedor, volver a hacer deployment y volver a arrancar) Mapeo O/R basado en entity beans limitado (p.ej. no considera la relacin de herencia) ...
Servidores de Informacin 2008/2009 3

Motivacin
J2EE objetivo: estandarizar servicios de uso comn en el desarrollo de aplicaciones empresariales
o

Directorio (JNDI), transacciones (JTA), conexin a sistemas legados (JCA), pooling de recursos, etc

EJB es slo una forma de llevar a la prctica a esos servicios a travs de un modelo de componentes Sin embargo podemos usar las funcionalidades de los servicios sin tener EJBs ... ... este es el objetivo de Spring: ofrecer libreras con las funcionalidades de uso comn por aplicaciones empresariales ... ... y ms "ligeras" que los EJBs
o

Usar POJOs (Plain Old Java Objects) en su lugar


Servidores de Informacin 2008/2009 4

Mdulos principales de Spring


Spring Core (Inversin del control (IoC) / Inyeccin de dependencias (DI)) Spring AOP (Programacin orientada a aspectos) Spring JDBC (Acceso a datos) Spring MVC (desarrollo Web segn el patrn MVC) Spring Remoting (distribucin) Spring Transaction Abstraction (Gestin de transacciones) Otros: Spring TestContext (pruebas), Spring JMX (gestin), Spring Security (seguridad), Spring Web Flow (control de flujos en aplicaciones Web)

Servidores de Informacin 2008/2009

Spring Core
Dependency Injection

IoC / DI: Introduccin


El ncleo 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 configuracin, 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 quin la necesite
Servidores de Informacin 2008/2009 7

IoC / DI: Introduccin


Se suele combinar con programacin basada en interfaces, para conseguir bajo acoplamiento entre componentes
o

Slo dependencia con las interfaces, no con las implementaciones concretas

Ventajas: o Se reduce el cdigo de pegamento


Llamadas a JNDI para localizar componentes Cdigo de conexin con componentes remotos
El contenedor proporciona proxy

Fichero de configuracin de dependencias: tocar slo ah para cambiarlas


Sin tocar el cdigo fuente y sin recompilar

Facilidad para llevar a cabo pruebas


Reemplazar componentes por Mockup objects
Servidores de Informacin 2008/2009 8

DI: HolaMundo (I)


Interfaz del servicio:
package spring.core.ejemplos; public interface MessagingService { public String sayMessage(String name); }

Servidores de Informacin 2008/2009

DI: HolaMundo (II)


Implementacin del servicio:
package spring.core.ejemplos; public class MessagingServiceImpl implements MessagingService { Message msg = null; public void setMsg(Message msg) { this.msg = msg; } public String sayMessage(String name) { return msg.getMsg() + " " + name; } }

Servidores de Informacin 2008/2009

10

DI: HolaMundo (III)


Message (interfaz e implementacin):
package spring.core.ejemplos; public interface Message { public String getMsg(); }

package spring.core.ejemplos; public class HelloMessage implements Message { public String getMsg() { return "Hello"; } }

Servidores de Informacin 2008/2009

11

DI: HolaMundo (IV)


Fichero de configuracin XML de Spring (spring-beans.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" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd"> <bean id="helloMsg" class="spring.core.ejemplos.HelloMessage"/> <bean id="helloSrv" class="spring.core.ejemplos.MessagingServiceImpl"> <property name="msg" ref="helloMsg"/> </bean> </beans>

Servidores de Informacin 2008/2009

12

DI: HolaMundo (y V)
Main de la aplicacin:
package spring.core.ejemplos; import org.springframework.context.ApplicationContext; import org.springframework.context.support.FileSystemXmlApplicationContext; public class Main { public static void main(String[] args) { ApplicationContext context = new FileSystemXmlApplicationContext("src/spring/core/ejemplos/spring-beans.xml"); MessagingService hello = (MessagingService)context.getBean("helloSrv"); System.out.println(hello.sayMessage(args[0])); } }

Servidores de Informacin 2008/2009

13

Spring AOP
Programacin Orientada a Aspectos

AOP: Introduccin
Qu es?
o o

Aspect Oriented Programming Permite combinar cierto cdigo con otro (aspecto) para aadir cierta funcionalidad al original sin necesidad de modificarlo o Facilitar la implementacin de funcionalidades transversales de una aplicacin
Ej.: logging, control acceso

Tipos de AOP
o

Esttica
En tiempo de compilacin
Se incluye la informacin de aspectos en los bytecodes

Problema: recompilar para modificar


o

Dinmica
En tiempo de ejecucin Problema: mayor coste computacional
Interrumpir flujo programa para comprobar si hay que ejecutar el aspecto

Servidores de Informacin 2008/2009

15

AOP: Conceptos
Joinpoint (Punto de cruce)
o

Punto concreto del flujo de ejecucin


Ej.: Llamada al mtodo hola de una determinada clase

Advice (Consejo)
o

Cdigo que el aspecto ejecuta en un joinpoint Combinacin de joinpoints Ej.: Llamada a cualquier mtodo de una clase concreta Combinacin de advice (cdigo) y pointcut (lugar donde se interrumpe el flujo normal para ejecutarlo) Objeto cuyo comportamiento modifica el aspecto

Pointcuts (Punto de corte)


o

Aspects (Aspecto)
o

Target (Destinatario)
o

Introduction
o Permite aadir mtodos o atributos a clases ya existentes
Servidores de Informacin 2008/2009 16

Spring AOP
AOP dinmica Implementada a travs de Proxys Ms limitada que la de otras libreras (ej.: AspectJ)
o

Ej.: Slo un tipo de joinpoint (invocacin a mtodo)


Se puede combinar AspectJ con Spring si se necesita ms

El propio framework utiliza aspectos para implementar otras funcionalidades


o

Ej.: Transacciones

A continuacin veremos el HolaMundo

Servidores de Informacin 2008/2009

17

Spring AOP: Hola Mundo (I)


Target:

package spring.aop.ejemplos; public class HelloWorldServiceImpl implements HelloWorldService { public String sayHello(String name) { return "Hello " + name; } }

Servidores de Informacin 2008/2009

18

Spring AOP: HolaMundo (II)


Advice:
package spring.aop.ejemplos; public class HelloWorldAdvice { public void antes() { System.out.println("Llamando a sayHello"); } public void despues(Object ret) { System.out.println("sayHello ha devuelto " + ret.toString()); } }

Servidores de Informacin 2008/2009

19

Spring AOP: HolaMundo (III)


Fichero de configuracin:
<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"> <bean id="helloSrv" class="spring.aop.ejemplos.HelloWorldServiceImpl" /> <bean id="helloAdvice" class="spring.aop.ejemplos.HelloWorldAdvice" /> <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 Informacin 2008/2009

20

10

Spring AOP: HolaMundo (y IV)


Main de la aplicacin:
package spring.aop.ejemplos; import org.springframework.context.ApplicationContext; import org.springframework.context.support.FileSystemXmlApplicationContext; public class Main { public static void main(String[] args) { ApplicationContext context = new FileSystemXmlApplicationContext("src/spring/aop/ejemplos/spring-beans.xml"); HelloWorldService hello = (HelloWorldService)context.getBean("helloSrv"); System.out.println(hello.sayHello(args[0])); } }

Servidores de Informacin 2008/2009

21

Spring Data Access

11

Acceso a datos
Una estructura Java tpica de acceso a BD:
public void saveWhatever(Whatever w) { Connection conn = null; PreparedStatement stmt = null; try { conn = dataSource.getConnection(); stmt = conn.prepareStatement(DB_QUERY); ... stmt.execute(); } catch (SQLException e) { } finally { try { if(stmt != null) { stmt.close(); } if(conn != null) { conn.close(); } } catch (SQLException e) { // noop } }

Servidores de Informacin 2008/2009

23

Acceso a datos
Aspectos a mejorar en el ejemplo: o SQLException: excepcin genrica o Captura de excepciones para no hacer nada Cmo lo mejora Spring? o Mapeo de SQLException a excepciones especficas
Subclases de org.springframework.dao.DataAccessException

Uso de unchecked exceptions


DataAccessException es una subclase de java.lang.RuntimeException Se pueden capturar si se desea, pero no es obligatorio

Automatiza la gestin 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 integracin con libreras ORM como Hibernate
Servidores de Informacin 2008/2009 24

12

Acceso a datos: HolaMundo (I)


Vamos a trabajar con una base de datos de productos:
Prod_ID char(5), Nombre varchar(20), Stock int, Precio double

Creamos un bean para trabajar con estos productos:


public class Producto { String id; String nombre; int stock; float precio; // Aqu van los getters y setters }
Servidores de Informacin 2008/2009 25

Acceso a datos: HolaMundo (II)


Interfaz del servicio de acceso a datos:
package spring.jdbc.ejemplos; public interface DataAccessService { public void insertarProducto(Producto p); public Producto consultarProducto(String id); }

Servidores de Informacin 2008/2009

26

13

Acceso a datos: HolaMundo (III)


Implementacin 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; public class DataAccessServiceImpl implements DataAccessService { private JdbcTemplate jdbcTemplate; public void setJdbcTemplate(JdbcTemplate jdbcTemplate) { this.jdbcTemplate = jdbcTemplate; } ...
Servidores de Informacin 2008/2009 27

Acceso a datos: HolaMundo (IV)


Implementacin del servicio de acceso a datos (II):
... private static final String PRODUCT_INSERT = "insert into Productos (prod_id, nombre, stock, precio) values (?,?,?,?)"; public void insertarProducto(Producto p) { jdbcTemplate.update(PRODUCT_INSERT, new Object[]{p.getId(), p.getNombre(), p.getStock(), p.getPrecio()}); } ...

Servidores de Informacin 2008/2009

28

14

Acceso a datos: HolaMundo (V)


Implementacin 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=?"; public Producto consultarProducto(String id) { List matches = jdbcTemplate.query(PRODUCT_SELECT, new Object[]{id}, new RowMapper() { public Object mapRow(ResultSet rs, int rowNum) throws SQLException, DataAccessException { Producto p = new Producto(); p.setId(rs.getString(1)); p.setNombre(rs.getString(2)); p.setStock(rs.getInt(3)); p.setPrecio(rs.getFloat(4)); return p; } } ); return matches.size() > 0 ? (Producto) matches.get(0) : null; }
Servidores de Informacin 2008/2009 29

Acceso a datos: HolaMundo (VI)


Fichero de configuracin 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="dataSource" class="org.apache.commons.dbcp.BasicDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/Productos"/> <property name="username" value="user"/> <property name="password" value="*****"/> <property name="initialSize" value="5" /> <property name="maxActive" value="10" /> </bean> <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> <property name="dataSource" ref="dataSource"/> </bean> <bean id="dao" class="spring.jdbc.ejemplos.DataAccessServiceImpl"> <property name="jdbcTemplate" ref="jdbcTemplate" /> </bean> </beans>
Servidores de Informacin 2008/2009 30

15

Acceso a datos: HolaMundo (y VII)


Main de la aplicacin:
package spring.jdbc.ejemplos; import org.springframework.context.ApplicationContext; import org.springframework.context.support.FileSystemXmlApplicationContext; public class Main { public static void main(String[] args) { ApplicationContext context = new FileSystemXmlApplicationContext("src/spring/jdbc/ejemplos/spring-beans.xml"); DataAccessService daoSvc = (DataAccessService)context.getBean("dao"); Producto p = new Producto(); p.setId("id123"); p.setNombre("NuevoProducto"); p.setPrecio((float)12.37); p.setStock(120); daoSvc.insertarProducto(p); System.out.println(daoSvc.consultarProducto("id123")); } }
Servidores de Informacin 2008/2009 31

Spring MVC
Desarrollo de aplicaciones Web

16

Spring MVC: Funcionamiento (I)

Fuente: Spring in action

Servidores de Informacin 2008/2009

33

Spring MVC: Funcionamiento (II)


(1) Las peticiones pasan a travs de un servlet que acta de Front Controller (DispatcherServlet) (2) El DispatcherServlet consulta a un HandlerMapping para decidir a qu controlador le pasa la peticin o Usa la URL de la solicitud para decidir (3 y 4) El controlador procesa la peticin, accede a la lgica de negocio y potencialmente obtiene resultados (modelo, un Map) adems selecciona la vista para presentar el modelo o Para que el controlador no est acoplado a la vista, se devuelve un identificador lgico (nombre) de vista o Devuelve al DispatcherServlet un objeto que encapsula ambos: ModelAndView
Servidores de Informacin 2008/2009 34

17

Spring MVC: Funcionamiento (y III)


(5) El DispatcherServlet utiliza un ViewResolver para resolver el nombre en una vista concreta o Normalmente un JSP, pero se soportan otros Velocity, XSLT,Tiles, ... (6) El DispatcherServlet utiliza la vista para mostrar el modelo al usuario

Servidores de Informacin 2008/2009

35

Spring MVC: DispatcherServlet


Objeto de la clase DispatcherServlet del paquete org.springframework.web.servlet Acta como un broker: despacha las peticiones que recibe al controlador responsable de tratarlas Configurar el /WEB-INF/web.xml de la aplicacin para que el dispatcher reciba las peticiones Lee su configuracin del fichero dispatcher-servlet.xml
o o o o

Ubicado en el /WEB-INF/ de la aplicacin Referencia al HandlerMapping Referencias a los controladores Referencia al ViewResolver

Servidores de Informacin 2008/2009

36

18

Spring MVC: HandlerMapping


Interfaz HandlerMapping del paquete org.springframework.web.servlet Spring proporciona varias implementaciones. Dos de las ms utilizadas son:
o o

Paquete: org.springframework.web.servlet.handler BeanNameUrlHandlerMapping


Seleccin por nombre del bean (el nombre coincide con la URL de invocacin). Es el HandlerMapping por defecto

<bean name="/home.htm" class="this.is.an.example.HomePageController"/>

SimpleUrlHandlerMapping
Se define una tabla que asocia URLs a controladores Lo veremos en el ejemplo

Servidores de Informacin 2008/2009

37

Spring MVC: Controller


Interfaz Controller del paquete org.springframework.web.servlet.mvc Mtodo principal:
ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception;

Usualmente para implementar un controlador se extiende de la clase abstracta AbstractController del mismo paquete Al controlador se le inyecta (si es necesario) la referencia al bean que ofrece el servicio de la lgica de negocio

Servidores de Informacin 2008/2009

38

19

Spring MVC: ViewResolver


Interfaz ViewResolver del paquete org.springframework.web.servlet Mtodo:
View resolveViewName(String viewName, Locale locale) throws Exception

Spring ofrece algunas implementaciones:


o o

Paquete: org.springframework.web.servlet.view ResourceBundleViewResolver


Un fichero bundle contiene las definiciones de vista (mapeo nombre de vista a implementacin de vista). Por ejemplo, bundle views_EN.properties:
nombre-vista.class=org.springframework.web.servlet.view.JstlView nombre-vista.url=/WEB-INF/views/en_GB/user/edit.jsp

UrlBasedViewResolver
No mapeo: el nombre es directamente una referencia a la vista No implementa soporte para localizacin Veremos en el ejemplo el uso de una de sus subclases: InternalResourceViewResolver

39

Spring MVC: View


Interfaz View del paquete org.springframework.web.servlet Mtodos principales:
String getContentType() void render(Map model, HttpServletRequest request, HttpServletResponse response) throws Exception

Spring proporciona mltiples implementaciones de esta interfaz


o

JstlView, VelocityView, TilesView, XsltView, ...

Servidores de Informacin 2008/2009

40

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> </web-app>
Servidores de Informacin 2008/2009 41

Spring MVC: HolaMundo (II)


Pgina de bienvenida: index.jsp
<%@page contentType="text/html" pageEncoding="UTF-8"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <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>
Servidores de Informacin 2008/2009 42

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> <bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> <property name="mappings"> <props><prop key="greet.do">greetingController</prop></props> </property> </bean> <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/> <property name="prefix" value="/WEB-INF/jsp/"/> <property name="suffix" value=".jsp"/> </bean> <bean name="greetingController" class="spring.mvc.ejemplos.GreetController"/> </beans> Servidores de Informacin 2008/2009 43

Spring MVC: HolaMundo (IV)


package spring.mvc.ejemplos; 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; public class GreetController extends AbstractController { protected ModelAndView handleRequestInternal(HttpServletRequest req, HttpServletResponse res) throws Exception { String param = req.getParameter("name"); if ((param == null) || (param.trim().equals(""))) { param = "Anonimous User"; } Map model = new HashMap(); model.put("usrName", param); return new ModelAndView("greet", model); } } Servidores de Informacin 2008/2009 44

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" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <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>

Servidores de Informacin 2008/2009

45

Spring Remoting
Acceso a componentes remotos

23

Spring Remoting: Introduccin


Objetivo: facilitar el desarrollo de aplicaciones distribuidas
o

Reducir el cdigo que se necesita para exponer un bean como servicio o para acceder desde un bean a un servicio remoto Definir service exporter (convertir bean en servicio) Definir proxies (acceder a beans remotos como locales)

Spring proporciona mecanismos para:


o o

En la prctica Spring 2.5 soporta cinco tipos distintos de arquitecturas distribuidas:


o o o o o

RMI Servicios Web (slo proxy, no exporter) HTTP Invoker (especfico de Spring) Hessian (Caucho.com, protocolo binario, poco utilizado) Burlap (Caucho.com, protocolo XML, poco utilizado)

Servidores de Informacin 2008/2009

47

Spring Remoting: HolaMundo (I)


Se ha convertido el HolaMundo en un servicio Web que atiende peticiones remotas Se pretende integrar ese servicio como un componente ms dentro de una aplicacin Spring Fragmento del WSDL del servicio:
<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>
Servidores de Informacin 2008/2009 48

24

Spring Remoting: HolaMundo (II)


Fichero de configuracin 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>
Servidores de Informacin 2008/2009 49

Spring Remoting: HolaMundo (III)


Main de la aplicacin:
package spring.remote.ejemplos; import org.springframework.context.ApplicationContext; import org.springframework.context.support.FileSystemXmlApplicationContext; public class Main { public static void main(String[] args) { ApplicationContext context = new FileSystemXmlApplicationContext("src/spring/core/ejemplos/spring-beans.xml"); HelloWorldService remoteHello = (HelloWorldService)context.getBean("remoteHelloSrv"); System.out.println(remoteHello.sayHello(args[0])); } }

Servidores de Informacin 2008/2009

50

25

Gestin de transacciones
Spring ofrece gestin de transacciones programtica 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 o o o

org.springframework.jdbc.datasource.DataSourceTransactionManager (JDBC) org.springframework.orm.hibernate3.HibernateTransactionManager (Hibernate) org.springframework.transaction.jta.JtaTransactionManager (JTA) ...


Servidores de Informacin 2008/2009 51

Gestin de transacciones
Ejemplo de (parte de) fichero de configuracin 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="dataSource" class="org.apache.commons.dbcp.BasicDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver"> <property name="url" value="jdbc:mysql://localhost/Productos"/> <property name="username" value="user"/> <property name="password" value="*******"/> </bean> <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. Rod Johnson; J2EE development without EJB. Ed Wrox, ISBN: 9780764558313, 2004. J. Machacek, A. Vukotic, A. Chakraborty, J.Ditt; Pro Spring 2.5. Ed. Apress, ISBN: 9781590599211, 2008. C. Walls, R. Breidenbac; Spring in action (2nd Ed.). Ed. Manning, ISBN: 9781933988139, 2007.

53

27

También podría gustarte