Beruflich Dokumente
Kultur Dokumente
desarrollo de aplicaciones.
Struts, WebWork y otros son frameworks para
web. Spring, por contra, da soporte a todas
las capas de una aplicacin.
Nos evita la fontanera que normalmente el
desarrollador se ve obligado a implementar a
mano.
Publicado en 2002/2003 por Rod
Johnson y Juergen Holler
Empez siendo un ejemplo en el libro
Expert One-on-One J2EE Design and
Development de Rod Johnson.
Spring 1.0 se publica en marzo del
2004
A partir de 2004/2005 Spring se
populariza como framework de
desarrollo para aplicaciones Java/J2EE
Spring no es un servidor de aplicaciones JEE,
sino que se integra en las aplicaciones que se
despliegan sobre ellos, y sobre aplicaciones
Java en general.
Spring sustituye elegantemente? algunos de
los servicios que aportan los servidores de
aplicaciones JEE.
Spring propone una estructura consistente para
toda la aplicacin.
Facilita un mtodo consistente para pegar todos
los elementos de la aplicacin.
Abierto a la integracin con mltiples estndares e
implementaciones populares como: Hibernate, JDO,
TopLink, EJB, RMI, JNDI, JMS, Web Services, Struts,
etc.
Permite aumentar nuestra productividad evitndo
al desarrollador la tarea de implementar tareas
derivadas de la integracin de los componentes de
la aplicacin.
From springframework.org
Taller prctico
Completar el modelo para que incorpore la clase
es.uniovi.si.factoria.Factoria que:
haga de factora
sea un singleton
Ejemplo:
ApplicationContext context = new
FileSystemXmlApplicationContext("c:/foo.xml");
Descargar la versin 8.0 del piloto y examinar
el cdigo fuente.
Ejecutarlo para comprobar que funciona
correctamente.
Vamos a extender el piloto 8.0 de forma que:
Aparezca una interfaz Instrumento con el mtodo toca()
que devuelve un String.
Aparezca una clase Saxofon que implemente la interfaz
Instrumento y suene tuuuut tuuuuu tutuuuu utuuuu
Aparezca un nuevo actor de tipo Instrumentista tal que:
Reciba por setter:
Nombre
El instrumento que toca
Al actuar, muestre un mensaje diciendo que fulanito hace
con el sonido que haga el instrumento que est tocando
Damos de alta un nuevo bean kenny, que se llame Kenny
G , que toque el saxofn y hacemos que sea l el que
acte en el Show.
Resuelto en piloto 9.0
Supuesto:
Contratamos a otro saxofonista para el Show:
<bean id="kenny"
class="com.springinaction.springidol.Instrumentalist">
<property name=nombre value=juan/>
<property name="instrument">
<ref bean="saxofon"/>
</property>
</bean>
Pero:
A Kenny G (que ye muy fino) no le gusta compartir
el saxofn
Cuntas instancias se crean del instrumento?
Inspirados en las inner classes de Java (Clases
que de definen dentro de otras clases)
Los inner beans son beans que se definen
dentro de otros beans, y cuyo mbito se
reduce al bean contenedor.
El bean contenido slo ser accesible por el
que lo contiene:
<property name="instrument">
<bean class="org.springinaction.springidol.Saxophone" />
</property>
(Ver ejemplo en piloto 10.0)
Hasta ahora hemos visto como utilizar Spring
para configurar propiedades simples, de un
solo valor o referencia. Pero Cmo hacerlo
cuando tratamos con colecciones?
Spring permite trabajar con cuatro tipos de
colecciones.
Coleccin Descripcin
List Lista de elementos con duplicados permitidos
Set Conjunto (sin elementos repetidos)
Map Coleccin de pares nombre-valor donde ambos
elementos pueden ser de cualquier tipo
Props Coleccin de pares nombre-valor donde ambos
elementos son de tipo String
Si quisiramos que en Show participasen kenny y
el bean actor.
Modificaremos la clase Show para que:
En lugar de tener un atributo de tipo actor, lo tenga de tipo
Collection<Actor>, con su correspondiente mtodo
setActores()
Al comenzar el show, haga actuar a todos los actores del
espectculo que encuentre en la coleccin.
for ( Actor actor:actores ){
actor.actua();
}
Extendemos el beans.xml para anidar a los dos actores
<property name="actores">
<list>
<ref bean/>
</list>
Resuelto en piloto 11.0
A partir del piloto 10, completarlo para que entre
el malabarista y el saxofonista, acte un hombre
orquesta que toque el saxofn, la armnica y la
guitarra. La armnica es suya y no la comparte,
pero la guitarra es de la organizacin del show.
Usaremos por convenio los nombres:
Clase Guitarra.
Clase Armonica
Clase HombreOrquesta
Clase
Hombre orquesta: Benja
<map>
<entry key="la guitarra" value-ref="fender" />
</beans>
Esta propiedad se puede sobrescribir a nivel
de bean individual.
Hasta ahora hemos usado la creacin bsica
de beans, asumiendo que Spring crea una
nica instancia de cada uno.
Existen ms opciones para gestionar la
instanciacin de beans:
Control del nmero de instancias creadas
Singleton
Una por request
Una por peticin
Creacin mediante factora
Incializacin y destruccin controlada del bean
Por defecto, todos son singleton
Problema: en determinados contextos, no
podemos/queremos usar singletons.
Utilizando el atributo scope del elemento
bean determinamos su ciclo de vida:
Scope Descripcin
singleton Valor por defecto. nica instancia por contenedor ?
prototype Se crea una instancia por peticin
request El mbito se reduce a la request HTTP (Spring MVC)
session El mbito se reduce a la sesin HTTP (Spring MVC)
global-session El mbito se reduce al contexto HTTP (Portlets)
Si queremos definir un bean como prototype:
<bean id=<identificador>
class=<nombre de la clase>
scope={prototype
|singleton
|request
|session
|global-session/>
Modificar la versin 15 del piloto para que:
El bean instrumento se instancie una vez por cada
bean que lo utilice
El Hombre Orquesta lo aada a su coleccin de
instrumentos
Junto con el sonido del saxofn, se muestre el
valor de la referencia del objeto que lo identifica
unvocamente en la JVM.
Si ahora quitamos el scope Hay diferencia?
<bean ...>
...
<replaced-method name=<mtodo a sustituir>
replacer=<bean sustituto>"/>
</bean>
Descargar piloto 20.0 (importante partir de ste,
incluye nuevas referencias a jars) y extenderlo
para sustituir el sonido del saxofn. Para ello:
Implementar una clase Sintentizador que modifique el
sonido del saxofn, retornando una nueva cadena de
sonido.
Darlo de alta en el beans.xml como sintentizador y
utilizar el elemento replaced-method en el beans
instrumento para sobrescribir el mtodo toca.
Funciona? Qu clase est realmente ejecutndose?
Aadir a la nueva cadena de sonido la referencia al
objeto que se ejectura (Wrapper).
Resuelto en Versin 21.0
(Ojo!!! Slo funciona si obtenemos el objeto a travs de
Spring!
Si el mtodo que queremos inyectar es un
mtodo getter para que retorne un bean
contenido en el contenedor, podemos
directamente obviar su implementacin y
decirle a Spring que intercepte la peticin.
<bean id=<nombre bean> class=<clase del bean>>
<lookup-method name=<nombre getter>" bean=<bean a
retornar>"/>
</bean>
Vamos a darle el cambiazo a kenny,
sustituyndole el saxofn por la guitarra fender.
Para ello,
Modificamos el mtodo actua de la clase Instrumentista
para que cuando acceda al instrumento lo haga a travs
de su mtodo getter.
Transformamos el inner bean fender en uno normal para
que pueda ser accedido desde otros beans.
Sobrescribimos el getter de kenny para que
getInstrumento retorne el bean fender.
(Resuelto en piloto 21.0)
Qu clase est realmente implementando el mtodo
acta?
Las propiedades vistas hasta ahora son
simples, pero normalmente nos enfrentamos
a estructuras ms complejas
Ej: Reconocer y procesar una URL:
http://www.xmethods.net/sd/BabelFishService.wsdl
Spring, puede convertir automticamente el
texto anterior en un objeto de tipo URL.
Cmo lo hace? Mediante un property editor
basado en la especificacin de Java Beans.
Interfaz java.beans.PropertyEditor
Permite especificar como se deben mapear datos
de tipo String en tipos no String.
Fuerza a tener dos mtodos:
getAsText()- Devuelve la representacin en forma de
String del valor
setAsText(String) Transforma el String que recibe en el
formato correspondiente.
Si se trata de dar un valor de tipo String a una
propiedad que no lo es, se disparar el mtodo
setAsText() para realizar la conversin.
getAsText() se usar para representar el valor.
Spring incorpora varios editores de
propiedades a medida, basados en la clase
PropertyEditorSupport.
PropertyEditor Utilidad
ClassEditor Transforma un String en una propiedad de tipo
java.lang.Class.
CustomDateEditor Transforma de String a java.util.Date
FileEditor Transforma de String a java.io.File
LocaleEditor Transforma de String a java.util.Locales
StringArrayPropertyEditor De una lista de Strings con comas a un array de
Strings
StringTrimmerEditor Hacer trim sobre el String.
URLEditor Transforma de String a URL
Podemos desarrollar nuestro propio editor de
propiedades personalizado para nuestra
aplicacin.
Ejemplo (A partir de piloto 22.00): Vamos a
aadir informacin de contacto a todos los
instrumentistas.
Creamos una clase Telefono con los atributos
codigoPais
numero
extension
Y sus correspondientes getters y constructor
parametrizado.
Aadimos una instancia de la clase Telefono como propiedad de
la clase Instrumentista
Y ahora configuraremos el contenedor para asignarle un telfono
a Kenny G.
<bean id="telefono1" class="es.uniovi.si.Telefono">
<constructor-arg value="0034"/>
<constructor-arg value="985105094"/>
<constructor-arg value="00"/>
</bean>
<bean id="propertyConfigurer"
class="org.springframework.beans.factory.config.PropertyPlaceh
olderConfigurer">
<property name="location" value=<fichero.properties>" />
</bean>
Puede que necesitemos modular la
configuracin en diferentes ficheros de
propiedades:
<bean id="propertyConfigurer"
class="org.springframework.beans.factory.config.PropertyPl
aceholderConfigurer">
<property name="locations">
<list>
<value>jdbc.properties</value>
<value>security.properties</value>
<value>application.properties</value>
</list>
</bean>
Ahora podemos recuperar los valores de
configuracin referencindolos por medio de
variables en lugar de tenerlos hardcodeados
en el beans.xml
<bean id="dataSource class=
"org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="url value="${database.url}" />
<property name="driverClassName value="${database.driver}" />
<property name="username value="${database.user}" />
<property name="password value="${database.password}" />
</bean>
Extender el piloto 25.0 para que tome los
siguientes datos del fichero
Configuracion.properties:
numero.malabares=25
tema=19 das y 500 noches
Persistencia
Traza
Persistencia Traza
..
Aspectos
un mtodo.
Punto de corte Un conjunto de condiciones aplicadas a un punto de
(Pointcut) enlace que, al cumplirse, activarn el punto de corte
y se ejecutar el punto de ejecucin asignado a
dicho punto de corte.
Punto de Fragmento de cdigo que se ejecuta cuando se
ejecucin o activa un punto de corte.
consejo (Advice)
Objetivo (target) El objetivo o target es el objeto sobre el que se va a aplicar
el aspecto, (Advised object), el objeto aconsejado.
Abrir Cortar
Pegar