Introducción a Spring
Norberto Fernández
Departamento de Ingeniería Telemática
Universidad Carlos III de Madrid
[email protected]
Servidores de Información 2008/2009
1
¿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
Servidores de Información 2008/2009
Fuente: Dzone
2
1
Motivación
• Malas experiencias con aplicaciones J2EE
o Complejas,difíciles de probar, pobres prestaciones,...
• Críticas al uso de EJBs:
o Rod Johnson, J2EE development without EJB (2004)
Complejidad (descriptores, implementación interfaces,...) y
baja productividad del programador
Modelo remoto basado sólo en RMI
Muchas aplicaciones no necesitan componentes remotos
Difíciles 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 relación de herencia)
...
Servidores de Información 2008/2009
3
Motivación
• J2EE objetivo: estandarizar servicios de uso común en el
desarrollo de aplicaciones empresariales
o Directorio (JNDI), transacciones (JTA), conexión a sistemas legados
(JCA), pooling de recursos, etc
• EJB es sólo una forma de llevar a la práctica a esos
servicios a través de un modelo de componentes
• Sin embargo podemos usar las funcionalidades de los
servicios sin tener EJBs ...
• ... este es el objetivo de Spring: ofrecer librerías con las
funcionalidades de uso común por aplicaciones
empresariales ...
• ... y más "ligeras" que los EJBs
o Usar POJOs (Plain Old Java Objects) en su lugar
Servidores de Información 2008/2009
4
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)
Servidores de Información 2008/2009
5
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
Servidores de Información 2008/2009
7
IoC / DI: Introducción
• Se suele combinar con programación basada en interfaces,
para conseguir bajo acoplamiento entre componentes
o Sólo dependencia con las interfaces, no con las implementaciones
concretas
• Ventajas:
o Se reduce el código de pegamento
Llamadas a JNDI para localizar componentes
Código de conexión con componentes remotos
El contenedor proporciona proxy
o Fichero de configuración de dependencias: tocar sólo ahí
para cambiarlas
Sin tocar el código fuente y sin recompilar
o Facilidad para llevar a cabo pruebas
Reemplazar componentes por Mockup objects
Servidores de Información 2008/2009
8
4
DI: HolaMundo (I)
Interfaz del servicio:
package spring.core.ejemplos;
public interface MessagingService {
public String sayMessage(String name);
}
Servidores de Información 2008/2009
9
DI: HolaMundo (II)
Implementación 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 Información 2008/2009
10
5
DI: HolaMundo (III)
Message (interfaz e implementación):
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 Información 2008/2009
11
DI: HolaMundo (IV)
Fichero de configuración 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 Información 2008/2009
12
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;
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 Información 2008/2009
13
Spring AOP
Programación Orientada a Aspectos
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
Servidores de Información 2008/2009
15
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
• Aspects (Aspecto)
Ej.: Llamada a cualquier método de una clase concreta
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
Servidores de Información 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 Información 2008/2009
18
9
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 Información 2008/2009
19
Spring AOP: HolaMundo (III)
Fichero de configuración:
<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 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;
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 Información 2008/2009
21
Spring Data Access
11
Acceso a datos
Una estructura Java típica 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 (SQLEx
Comentarios de: Introducción a Spring (0)
No hay comentarios