7/31/2019 01. Spring Framework
1/159
Haga clic para modificar el estilo de subttulo delpatrn
Introduccin al
Framework Spring
7/31/2019 01. Spring Framework
2/159
Spring es un framework ligero para eldesarrollo de aplicaciones.
Strtus, WebWork y otros son frameworkspara web. Spring, por contra, da soporte atodas las capas de una aplicacin.
Nos evita la fontanera que normalmenteel desarrollador se ve obligado a
implementara mano
.
Qu es Spring?
7/31/2019 01. Spring Framework
3/159
Publicado en 2002/2003 por RodJohnson y Juergen HollerEmpez siendo un ejemplo en el libro
ExpertOne-on-One J2EE Design and Developmentde Rod Johnson.
Spring 1.0 se publica en marzo del2004
A partir de 2004/2005 Spring sepopulariza como framework dedesarrollo para aplicaciones Java/J2EE
Historia de Spring
http://www.wrox.com/WileyCDA/WroxTitle/productCd-0764543857.htmlhttp://www.wrox.com/WileyCDA/WroxTitle/productCd-0764543857.htmlhttp://www.wrox.com/WileyCDA/WroxTitle/productCd-0764543857.htmlhttp://www.wrox.com/WileyCDA/WroxTitle/productCd-0764543857.html7/31/2019 01. Spring Framework
4/159
Spring no es un servidor de aplicaciones JEE,sino que se integra en las aplicaciones quese despliegan sobre ellos, y sobreaplicaciones Java en general.
Spring sustituye elegantemente? algunosde los servicios que aportan los servidoresde aplicaciones JEE.
Spring & JEE?
7/31/2019 01. Spring Framework
5/159
Spring propone una estructura consistente paratoda la aplicacin
Facilita un mtodo consistente parapegartodoslos 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 evitndoal desarrollador la tarea de implementar tareas
derivadas de la integracin de los componentes dela aplicacin.
Qu aporta Spring?
7/31/2019 01. Spring Framework
6/159
From springframework.org
Los creadores de Spring defienden que:JEE debera ser ms sencilla de usarEs preferible programar interfaces a programar
clases, pero sto conlleva usualmente un costeadicional de implementacin. Spring lo facilita
reduciendo la implementacin desacopladabasndose en interfaces.La especificacin de JavaBeans ofrece ciertas
ventajas a la hora de externalizar y modularizar laconfiguracin de las aplicaciones.
El paradigma OO debe imponerse sobre latecnologa subyacente como _JEE
Filosofade Spring
7/31/2019 01. Spring Framework
7/159
Filosofa POJO, menos interfaces y excepcioneschequeadas que fuerzan a complicar el cdigocuando integramos elementos diferentes.
La prueba del software son esenciales. Spring nosayuda a implementar cdigo chequeable mediante
pruebas unitarias.La aplicacin de Spring debe ser placentera.El cdigo de la aplicacin no debe depender de las
APIs de Spring.Spring no debe competir con soluciones que ya
funcionan, sino permitir su fcil integracin en laaplicacin (Ej, Hibernate, JDO, etc.)
Filosofade Spring
7/31/2019 01. Spring Framework
8/159
Arquitectura
from springframework.org
7/31/2019 01. Spring Framework
9/159
Qu implica esto?No fuerza a importar o extender ninguna API de
Spring.Una tecnologa invasiva compromete nuestro
cdigo con sus implementaciones-Anti-patrones:
EJB nos fuerza a usar JNDI Struts 1.x fuerza a extender la clase Action
Los Frameworks invasivos son por lo general difciles
de testear.
Tecnologa no invasiva
7/31/2019 01. Spring Framework
10/159
Fundamentalmente, Spring se compone de:Contenedor de inversin de control (IoC)
Aplicacin de la tcnica de inyeccin de dependencias(Fowler)
Un framework AOP. Spring facilita un framework AOP basado en proxy. Integrable con AspectJ o AspectWerkz
Una capa de abstraccin de servicios Integracin consistente con varios estndares y APIs
populares.
Todo ello est basado en la implementacin deaplicaciones usando POJOs.
Estructura de Spring
7/31/2019 01. Spring Framework
11/159
Haga clic para modificar el estilo de subttulo delpatrn
Spring IoC ContainerInyeccin de dependencias
7/31/2019 01. Spring Framework
12/159
Gestiona objetos como componentes,permitiendo: Crearlos Configurarlos Cablearlos (Wiring) Enlazado entre objetos. Controlar todo si ciclo de vida Controlar su destruccin
Ofrece varios tipos de contenedor diferentes,
clasificables en dos tipos: BeanFactory ApplicationContext (ms completo)
Para qu vale?
7/31/2019 01. Spring Framework
13/159
Descarguemos el piloto 1.0 y analicemos sucdigo.
Funciona?Cmo estn las clases?Con cuantos tipos de actores puede
funcionar el espectculo que estamosmodelando?
Qu tengo que hacer para variar el tipo deactor?
Aplicaciones fuertementeacopladas
7/31/2019 01. Spring Framework
14/159
Bajamos ahora el piloto 2.0. Qu hemos mejorado? Estn las clases completamente desacopladas por el mero
hecho de utilizar una interfaz?
Taller prcticoCompletar el modelo para que incorpore la clasees.uniovi.si.factoria.Factoria que: haga de factora sea un singleton tenga un mtodo Object getService(String) que cuando
reciba Malabarista devuelva una instancia de la claseMalabarista.
(Resuelto en piloto 3.0)
Refactorizando
7/31/2019 01. Spring Framework
15/159
El BeanFactory es una implementacindel patrn factora que permite crearbeans declarndolos en un ficheros XMLcuya raiz es la etiqueta
El XML contiene uno o ms elementos detipo
Atributo id (o nombre) para identificar el bean Atributo class que especifica el nombrecualificado completo de la clase queimplementar el bean bautizado con id
El contenedor BeanFactory
7/31/2019 01. Spring Framework
16/159
Por defecto, los beans son tratados comosingletons (Dessign patterns, GoF94),aunque existen otros posibles patrones decomportamiento.
Ejemplo:
El contenedor BeanFactory
The beans IDThe beans fully-
qualified classname
7/31/2019 01. Spring Framework
17/159
Para utilizarlo:BeanFactory factory = new XmlBeanFactory();
Factory.getBean();
El documento XML debe ser encapsulado por alguna de lassiguientes clases wrapper.
El contenedor BeanFactory
Implementacin PropsitoByteArrayResource El documento viene como un
array de bytesClassPathResource Busca el documento en el
classpathDescriptiveResource Mantiene una descripcin del
documento pero no el fichero derecursos en s.
FileSystemResource Carga el documento del sistema
7/31/2019 01. Spring Framework
18/159
El documento XML declara los beans,asocindoles el identificador por el cual vana ser referenciados.
El contenedor BeanFactory
7/31/2019 01. Spring Framework
19/159
Descargar piloto 4.0 y examinar el cdigofuente.
Extender sta versin del piloto para que laclase Show: Implemente un interfaz evento que contenga su
mtodo de comienzo. Sea tambin creada por medio de la factora
BeanFactory, bajo el id de evento.
(Resuelto en piloto 5.0)
Taller prctico
7/31/2019 01. Spring Framework
20/159
El ciclo de vida conBeanFactory
7/31/2019 01. Spring Framework
21/159
El ciclo de vida conBeanFactory
Etapa DescripcinInstantiate. Instancia el Bean
Populate properties. Spring Inyecta las propiedades.
Set Bean name Si el bean implementa BeanNameAware, Spring lefacilita su id invocando setBeanName.
Set Bean Factory Si el bean implementa BeanFactoryAware, Spring lefacilita su factora invocando setFactory.
Postprocess (antes de lainicializacin)
Si existen BeanPostProcessors, Spring invoca sumtodo postProcessBeforeInitialization()
Intialize beans Si implementa InitializingBean, invocaafterPropertiesSet()
PostProcess Siexisten BeanPostProcessors, Spring invoca sumtodopostProcessAfterInitialization()
Bean Ready to Use El bean pasa a estar disponible.
Destroy Bean Si implementa DisposableBean, se invoca sumtodo destroy()
7/31/2019 01. Spring Framework
22/159
A partir del piloto 5.0, Definir un constructor pblico en la clase
Malabarista que inicialice el nmero de objetoscon los que hace los malabarismos.
Modificar el bean.xml para que reciba 15 comoparmetro de constructor al crear el bean. Probarlo Una vez comprobado, sobrecargamos el
constructor con otro que reciba una cadena detexto y la muestre por pantalla. Qu sucede?
Aadir la etiqueta type para forzar a que sedispare el constructor que nos interesa.
(resuelto en piloto 6.0)
Taller prctico
7/31/2019 01. Spring Framework
23/159
Es el segundo tipo de inyeccin dedependencias posible.
En lugar de pasarle la informacin por mediodel mtodo constructor, le decimos a Springque le haga llegar la propiedad en elbean.xml
Para ello debemos: Tener un mtodo set para la propiedad Aadir una etiqueta property anidada a la
definicin del bean en el bean.xml
Inyeccin de parmetrospor mtodos setter
7/31/2019 01. Spring Framework
24/159
Adems de valores sencillos, es posibleinyectar una referencia a otro bean dado dealta en el contenedor.
Ejemplo:
Esto implica que la clase WidgetServiceImpldeber tener un mtodosetWidgetDAO(WidgetServiceImpl ref)
Inyeccin de referenciasde objetos
7/31/2019 01. Spring Framework
25/159
Modificar el piloto para que la clase Showreciba como dependencia la instancia de laclases Malabarista en su propiedad actor.
(Resuelto en piloto 7.0)
Taller prctico
7/31/2019 01. Spring Framework
26/159
Es una extensin del BeanFactory (hereda del)
Permite ms opciones: Incorpora mecanismos para la externalizacin de
cadenas de texto e internacionalizacin (i18n) Unifica la carga de recursos, como las imgenes. Permite implementar un modelo de paso de
mensajes mediante eventos a los beans,
declarndolos como listeners del evento.Por lo general, se usa ste en lugar del
BeanFactory, a no ser que estemos enentornos de recursos restringidos
(dispositivos mviles o similares).
El ContenedorApplicationContext
7/31/2019 01. Spring Framework
27/159
Hay tres implementaciones del contenedor:
Ejemplo:ApplicationContext context = newFileSystemXmlApplicationContext("c:/foo.xml");
El ContenedorApplicationContext
Tipo DescripcinClassPathXmlApplicationContext Carga el documento XML
buscndolo en el classpath
FileSystemXmlApplicationContext Lo busca en el sistema deficheros
XmlWebApplicationContext Lo busca como doc. XMLcontenido en unaaplicacin web.
7/31/2019 01. Spring Framework
28/159
El ciclo de vida conApplicationContext
7/31/2019 01. Spring Framework
29/159
Descargar la versin 8.0 del piloto yexaminar el cdigo fuente.
Ejecutarlo para comprobar que funcionacorrectamente.
Taller prctico
7/31/2019 01. Spring Framework
30/159
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 tuuuuututuuuu utuuuu Aparezca un nuevo actorde tipo Instrumentista
tal que:Reciba por setter:
Nombre El instrumento que tocaAl actuar, muestre un mensaje diciendo que fulanitohace con el sonido que haga el instrumento queest tocando
Damos de alta un nuevo bean kenny, que se
Taller prctico Juntndolotodo
7/31/2019 01. Spring Framework
31/159
Supuesto: Contratamos a otro saxofonista para el Show:
Pero: A Kenny G (que ye muy fino) no le gusta
compartir el saxofnCuntas instancias se crean del instrumento?
Problema
7/31/2019 01. Spring Framework
32/159
Inspirados en las inner classes de Java(Clases que de definen dentro de otrasclases)
Los inner beans son beans que se definendentro de otros beans, y cuyo mbito sereduce al bean contenedor.
El bean contenido slo ser accesible por elque lo contiene:
(Ver ejemplo en piloto 10.0)
Inner Beans
7/31/2019 01. Spring Framework
33/159
Hasta ahora hemos visto como utilizar Springpara configurar propiedades simples, de unsolo valor o referencia. Pero Cmo hacerlocuando tratamos con colecciones?
Spring permite trabajar con cuatro tipos decolecciones.
Cableado de colecciones
Coleccin Descripcin
List Lista de elementos con duplicadospermitidos
Set Conjunto (sin elementos repetidos)
Map Coleccin de pares nombre-valor
donde ambos elementos pueden ser decual uier ti o
7/31/2019 01. Spring Framework
34/159
Si quisiramos que en Show participasenkennyy el bean actor. Modificaremos la clase Show para que:En lugar de tener un atributo de tipo actor, lo tenga
de tipo Collection, con su correspondientemtodo 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 dosactores
Cableado de colecciones
7/31/2019 01. Spring Framework
35/159
A partir del piloto 10, completarlo para queentre el malabarista y el saxofonista, acteun hombre orquesta que toque el saxofn, laarmnica y la guitarra. La armnica es suya
y no la comparte, pero la guitarra es de laorganizacin del show.
Usaremos por convenio los nombres: Clase Guitarra. Clase Armonica Clase HombreOrquesta Clase Hombre orquesta: Benja
Taller prctico: Repasando
7/31/2019 01. Spring Framework
36/159
Para cablear un Map, El objeto se tiene que esperar que le pasen como
parmetro una instancia de la clase Map.
Public void setInstrumentos(Map )
El beans.xml debe enlazar el mapa con el
parmetro instrumentos.
Cableado de Mapas
7/31/2019 01. Spring Framework
37/159
Extender piloto 11.0 para que en lugar depasar directamente las referencias a losbeans que toca el Hombre Orquesta, lepasemos un mapa con el nombre que le
queramos dar al instrumento, de forma queel mensaje al tocarlo sea
El hombre orquesta toca la guitarra:rrriaaannn riiiaaaannn riiiiaaaannnnnnnn
Resuelto en piloto 12
Taller prctico
7/31/2019 01. Spring Framework
38/159
Modificar el piloto 12 para que: A cada actor pueda asignrsele un nombre
artstico cada vez que se enlace al show La salida una vez resuelto, ser algo como:
Presentamos a Tony MalabaresHaciendo malabarismos con 15 objetos
Presentamos a El Increible hombre orquesta
El hombre orquesta toca la
guitarra:rrriaaannn riiiaaaannnriiiiaaaannnnnnnn
El hombre orquesta toca la armnica:tui tuituiiiiii tuiiiiiii
Presentamos a Kenny G!
Kenny G hace ttuuuuuu tuuuu tuuuuut
Taller prctico
7/31/2019 01. Spring Framework
39/159
Hemos visto como cablear beans Con el elemento Con el elemento
Problema: En una aplicacin complicada,
esta prctica puede degenerar en un XMLdesmesurado e inmanejable.
Alternativa: En lugar de definirexplcitamente las relaciones entre beans,
podemos dejar que Spring decida como debecablearlos, mediante la propiedad autowiredel elemento
Auto-Cableado en Spring(Autowire)
7/31/2019 01. Spring Framework
40/159
Tipos de autocableado:
Auto-Cableado en Spring(Autowire)
Tipo Descripcin
byName Trata de buscar un bean declarado en elcontenedor cuyo nombre o identificador-
coincida con la propiedad del beanmarcado como autocableable
byType Busca un nico bean que coincida en tipocon la propiedad del bean marcado como
autocableable. Si no se encuentra, lapropiedad se queda sin mapear. Si seencuentra ms de una, salta una excepcinUnsatisfiedDependencyException
constructor Trata de encajar uno o ms beansdeclarados en el contenedor con los
7/31/2019 01. Spring Framework
41/159
Todo en Spring tiene un nombre.
Si queremos simplificar el XML:
7/31/2019 01. Spring Framework
42/159
Similar a byName, salvo que la bsqueda larealiza por tipo, y no por nombre
Por cada bean autocableado por tipo, Introspecciona las propiedades del bean Por cada setXXX no cableado explcitamente en el
beans.xml, busca un bean declarado quecoincida en tipo con la propiedad, y si loencuentra, lo cablea.
Probamos: Partiendo del piloto 14.0, cambiarel autowire a byType. Funciona?Qu podemos hacer para arreglarlo?
(Resuelto en piloto 15.0)
Autowire byType
7/31/2019 01. Spring Framework
43/159
til cuando utilizamos inyeccin dedependencias en el constructor.
Si declaramos un bean autocableable porconstructor: Spring busca por instrospeccin los constructores
del bean Por cada uno, trata de buscar candidatos para
satisfacer los tipos de sus parmetros entre los
beans declarados en el beans.xml Si los encuentra, invoca el constructor.
En caso de ambigedad, dispara unaexcepcin igual que cuando usamos byType
Autowire por constructor
7/31/2019 01. Spring Framework
44/159
Nos permite delegar en el contenedor ladecisin de qu bean debe ser cableado conotro, y de qu forma.
Para este ejemplo, Spring tratar deautocablear el bean por constructor, y en
caso de no tener xito, lo intentar por tipo.
Autodeteccin de autowire
7/31/2019 01. Spring Framework
45/159
Si vamos a adoptar una poltica comn deautocableado para todos los beans, podemosdeclararla a nivel de contenedor:
Esta propiedad se puede sobrescribir a nivelde bean individual.
Autocableado por defecto
C t l d l i l d id
7/31/2019 01. Spring Framework
46/159
Hasta ahora hemos usado la creacin bsicade beans, asumiendo que Spring crea unanica instancia de cada uno.
Existen ms opciones para gestionar la
instanciacin de beans: Control del nmero de instancias creadasSingletonUna por request
Una por peticin Creacin mediante factora Incializacin y destruccin controlada del bean
Control del ciclo de vidadel Bean
7/31/2019 01. Spring Framework
47/159
Por defecto, todos son singletonProblema: en determinados contextos, no
podemos/queremos usar singletons.Utilizando el atributo scope del elemento
bean determinamos su ciclo de vida:
del BeanControl del mbito (scope) del
bean
Scope Descripcin
singleton Valor por defecto. nica instancia porcontenedor ?
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
7/31/2019 01. Spring Framework
48/159
Si queremos definir un bean como prototype:
Uso del atributo scope
7/31/2019 01. Spring Framework
49/159
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 identificaunvocamente en la JVM.
Si ahora quitamos el scope Hay diferencia?
(Resuelto en piloto 16.0)
Taller prctico
C i d b d d
7/31/2019 01. Spring Framework
50/159
Normalmente creamos las clases con suconstructor pblico, pero por distintosmotivos (cdigo heredad, libreras deterceras partes, etc.), es posible que el bean
que queremos cablear deba ser creado apartir de un factory method
Ejemplo: Queremos incorporar a modelo del Show un
escenario que tenemos ya implementado de otraparte del sistema. Como es nico, vieneimplementado como singlenton.
Creacin de beans desdefactoras
C i d b d d
7/31/2019 01. Spring Framework
51/159
Para la instanciacin de este tipo de objetos,el elemento bean permite especificar elfactory-method que debe invocar elcontenedor para obtener una instancia del
bean.
7/31/2019 01. Spring Framework
52/159
A partir del piloto 16.0: Crear una clase Escenario que implemente el
patrn singleton, y llamamos al mtodo decreacin de instancia getInstancia().
Sobrescribir su mtodo toString para que retorneEscenario Central. Modificar la aplicacin para que el Show, antes de
comenzar la actuacin, obtenga una referencia alescenario y muestre por pantalla:
Bienvenidos al Escenario Central
(Resuelto en trabajo 17.0)
Taller prctico
Iniciali acin destr ccin
7/31/2019 01. Spring Framework
53/159
Es posible que un determinado beanrequiera hacer operaciones de inicializacinantes de poder realizar su tarea, o bienliberar recursos conexiones a bbdd, cierre
ficheros, etc- antes de su destruccin.Los atributos:
init-method destroy-method
nos permiten decirle al contenedor qu dos mtodosqueremos que realicen estas tareas de inicializacin ydestruccin.
Al igual que con autowire, se pueden especificar los
nombres de los mtodos constructor y destructor a- -
Inicializacin y destruccinde beans
7/31/2019 01. Spring Framework
54/159
A partir de trabajo 17.0: Implementar en el saxofn y en la armnica un
mtodo afinar y otro limpiar que publiquensendos mensajes por la consola.
Hacer que ambos se disparen como mtodo deinicializacin y mtodo de destruccin. Probarlo. Funciona? Y si ahora lo pongo por defecto para todos los
beans?
Taller prctico
7/31/2019 01. Spring Framework
55/159
Modificar y extender la clase Escenario paraque tenga los mtidos abrirTelon cerrarTelon
Que impriman sendos mensajes y que seainvocado al inicializar y al destruir la clase.
Taller prctico
Inicializacin por I D por
7/31/2019 01. Spring Framework
56/159
A partir del ejemplo anterior una vezterminado, probar a forzar a que la claseInstrumentista implemente las interfaces InitializingBean
DisposableBeanQu ocurre? Hacer lo necesario para que seacompilable y ejecutarlo.
Resuelto en piloto 18.0
Inicializacin por I.D. porinterfaces
7/31/2019 01. Spring Framework
57/159
Modificar la clase Escenario de nuevo paraque la inicializacin y destruccin se realicenahora por usando los dos interfaces: InitializingBean
DisposableBean
Taller prctico
7/31/2019 01. Spring Framework
58/159
Haga clic para modificar el estilo de subttulo delpatrn
Cableado avanzado debeans
7/31/2019 01. Spring Framework
59/159
Hasta ahora hemos declarado los beans deforma individual, estableciendo laspropiedades de cada uno una a una de formaespecfica.
Problema: Puede degenerar en ficheros deconfiguracin muy extensos y pocotratables.
Ejemplo: Tenemos muchos beans de un determinado tipo
que comparten caractersticas ->Tenemos quedefinir la misma caracterstica en todos ellos.
En una orquesta, todos los instrumentistas tocan
la misma cancin
Herencia
7/31/2019 01. Spring Framework
60/159
Al igual que en la POO, es posible definirrelaciones padre-hijo entre los beansdeclarados en un contenedor.
Un bean que extiende la declaracin de otro
bean se define como sub-bean del segundo.Dos atributos especficos para esto:
Parent: Declara de qu bean hereda el queestamos declarando
Abstract: Declara el bean como abstracto, y por lotanto, no instanciable.
Herencia
7/31/2019 01. Spring Framework
61/159
Ejemplo
7/31/2019 01. Spring Framework
62/159
Modificar el piloto a partir de su versin 18para que: Aparezca un bean Saxofonista que:Sea abstracto
Est ligado al Saxofn En el show participe un nuevo saxofonista con
id=bill y nombre=Bill Clinton. Ser presentadocomo El presidente Clinton!.
Resuelto en trabajo 19.0
Taller prctico
7/31/2019 01. Spring Framework
63/159
Extender ahora el piloto 19.0 para que: Tanto los instrumentistas como los hombres
orquesta tengan un atributo de tipo String que sellame tema.
Poner a todos los implicados de acuerdo para quetoquen Paquito el Chocolatero...
Se repite configuracin?
Debemos ligar el atributo tema a la clase Actor?Y el malabarista?
Creamos una nueva clase intermedia?
Taller prctico - repaso
Abstraccin de
7/31/2019 01. Spring Framework
64/159
En determinados contextos, puede quenecesitemos compartir valores depropiedades entre beans de diferentesclases.
Spring permite hacer esto declarando unbean abstracto sin especificar su clase, yforzando a los hijos a que lo extiendan.
7/31/2019 01. Spring Framework
65/159
Definir un bean abstracto Interprete quedefina el valor de la propierdad tema paraque toque Paquito el chocolatero yconfigurar los bean Hombre Orquesta y
Saxofonista para que hereden dichapropiedad del intrprete.(Resuelto en piloto 20.0)
Taller prctico
7/31/2019 01. Spring Framework
66/159
Habitual el lenguajes dinmicos como Ruby.Consiste en aadir nuevos mtodos a una
clase ya compilada, o modificar la definicinde alguno ya existente.
En Java y otros LOO clsicos no se puedehacer esto, son poco flexibles
Spring permite simular la inyeccin demtodos en los beans que tenga declaradosen el contenedor. Dos tipos: Remplazo de mtodos Inyeccin de Getter
Inyeccin de mtodos
Remplazo bsico de
7/31/2019 01. Spring Framework
67/159
Spring interceptar las invocaciones que serealicen al mtodo sustituido para inyectaren medio la nueva implementacin delmismo
Es necesario implementar un objeto quecumpla la interfaz MethodReplacerpublic class implementsMethodReplacer {
public Object reimplement(Object target, Method method,
Object[] args) throws Throwable {
...
}
Remplazo bsico demtodo
Remplazo bsico de
7/31/2019 01. Spring Framework
68/159
Una vez dado de alta, sustituimos el mtodoen el beans.xml
Remplazo bsico demtodo
7/31/2019 01. Spring Framework
69/159
Descargar piloto 20.0 (importante partir deste, incluye nuevas referencias a jars) yextenderlo para sustituir el sonido delsaxofn. Para ello:
Implementar una clase Sintentizador quemodifique el sonido del saxofn, retornando unanueva cadena de sonido.
Darlo de alta en el beans.xml comosintentizador y utilizar el elemento replaced-method en el beans instrumento parasobrescribir el mtodo toca.
Funciona? Qu clase est realmenteejecutndose? Aadir a la nueva cadena de
sonido la referencia al objeto que se ejectura
Taller prctico
7/31/2019 01. Spring Framework
70/159
Si el mtodo que queremos inyectar es unmtodo getter para que retorne un beancontenido en el contenedor, podemosdirectamente obviar su implementacin y
decirle a Spring que intercepte la peticin.
Inyeccin de Getter
7/31/2019 01. Spring Framework
71/159
Vamos a darle el cambiazo a kenny,sustituyndole el saxofn por la guitarrafender.
Para ello,
Modificamos el mtodo actua de la claseInstrumentista para que cuando acceda alinstrumento lo haga a travs de su mtodo getter.
Transformamos el inner bean fender en uno
normal para que pueda ser accedido desde otrosbeans. Sobrescribimos el getter de kenny para que
getInstrumento retorne el bean fender.(Resuelto en piloto 21.0)
Qu clase est realmente im lementando el mtodo
Taller prctico
Registrando editores de
7/31/2019 01. Spring Framework
72/159
Las propiedades vistas hasta ahora sonsimples, pero normalmente nos enfrentamosa estructuras ms complejas
Ej: Reconocer y procesar una URL:http://www.xmethods.net/sd/BabelFishService.wsdl
Spring, puede convertir automticamente eltexto anterior en un objeto de tipo URL.Cmo lo hace? Mediante unproperty editor
basado en la especificacin de Java Beans.
gpropiedadespersonalizados
7/31/2019 01. Spring Framework
73/159
Interfaz java.beans.PropertyEditorPermite especificar como se deben mapear
datos de tipo String en tipos no String.Fuerza a tener dos mtodos:
getAsText()- Devuelve la representacin en formade String del valor
setAsText(String) Transforma el String que recibeen el formato correspondiente.
Si se trata de dar un valor de tipo String auna propiedad que no lo es, se disparar elmtodo setAsText() para realizar laconversin.
getAsText() se usar para representar el
El interfaz PropertyEditor
7/31/2019 01. Spring Framework
74/159
Spring incorpora varios editores depropiedades a medida, basados en la clasePropertyEditorSupport.
PropertyEditors de Spring
PropertyEditor Utilidad
ClassEditor Transforma un String en unapropiedad de tipo java.lang.Class.
CustomDateEditor Transforma de String a java.util.Date
FileEditor Transforma de String a java.io.FileLocaleEditor Transforma de String a
java.util.Locales
StringArrayPropertyEditor
De una lista de Strings con comas aun arra de Strin s
Desarrollo de
7/31/2019 01. Spring Framework
75/159
Podemos desarrollar nuestro propio editor depropiedades personalizado para nuestraaplicacin.
Ejemplo (A partir de piloto 22.00): Vamos a
aadir informacin de contacto a todos losinstrumentistas.
Creamos una clase Telefono con losatributos codigoPais numero extension
Y sus correspondientes getters y constructor
parametrizado.
Desarrollo dePropertyEditors a medida
Desarrollo de
7/31/2019 01. Spring Framework
76/159
Aadimos una instancia de la clase Telefonocomo propiedad de la clase InstrumentistaY ahora configuraremos el contenedor para
asignarle un telfono a Kenny G.
< ro ert name="nombre" value="Kenn
Desarrollo dePropertyEditors a medida
Desarrollo de
7/31/2019 01. Spring Framework
77/159
Alternativa:
Creamos nuestropropio
PropertyEditor:public class TelefonoPropertyEditorextends PropertyEditorSupport {
Desarrollo dePropertyEditors a medida
Desarrollo de
7/31/2019 01. Spring Framework
78/159
Ahora slo nos falta decirle aSpring cuando y como aplicar elnuevo property editor, por medio
del CustomEditorConfigurerCustomEditorConfigurer es unBeanPostProcessor que carga los
editores de propiedades en laBeanFactory. Para ello:
7/31/2019 01. Spring Framework
79/159
Ahora ya podemos asignrselo directamentea kenny
(Resuelto en piloto 23.0)
Desarrollo dePropertyEditors a medida
T ll ti
7/31/2019 01. Spring Framework
80/159
Creamos ahora un propertyEditor para elemail: Creamos una clase email con dos propiedades:
usuario y servidor. Hacemos sus accessors y su
constructor parametrizado Aadimos Email como propiedad deinstrumentista
Creamos el properyeditor para convertir el emailemail.setUsuario(texto.substring(0,texto.indexOf('@')));
email.setServidor(texto.substring(
texto.indexOf('@')+1,texto.length()));
Aadimos el nuevo email property editor al map
del CustomEditorConfigurer
Taller prctico
Los beans especiales de
mailto:[email protected]7/31/2019 01. Spring Framework
81/159
La mayora de los beans que manejar elcontenedor son tratados de la misma forma la vista hasta ahora.
Para determinadas tareas, Spring permite
especificar que determinados beans seantratados de manera especial.
Para marcar aquellos beans que deben sertratados como tales, nos serviremos de la
inyeccin de dependencias porinterfaces.
Los beans especiales deSpring
Los beans especiales de
7/31/2019 01. Spring Framework
82/159
Mediante estos, podemos: Tomar parte en la creacin de los beans y en el
ciclo de vida de la factora medianteposprocesamiento.
Cargar ficheros de configuracin externos enficheros property
Cargar mensajes de texto, como base para lainternacionalizacin.
Ligar el bean a la recepcin de eventos.
Los beans especiales deSpring
7/31/2019 01. Spring Framework
83/159
Creacin del
7/31/2019 01. Spring Framework
84/159
El bean debe implementar la interfazBeanPostProcessor:
public interface BeanPostProcessor
{
ObjectpostProcessBeforeInitialization( Object bean,String name) throws BeansException;
ObjectpostProcessAfterInitialization( Object bean,String name) throws BeansException;
}
Creacin delBeanPostProcessor
Configurar el
7/31/2019 01. Spring Framework
85/159
Tenemos dos alternativas: Si trabajamos con BeanFactory:
BeanPostProcessor fuddifier = new Fuddifier();
factory.addBeanPostProcessor(fuddifier);
Si trabajamos con ApplicationContext:
7/31/2019 01. Spring Framework
86/159
Queremos desarrollar un postprocesador quese chive de quienes estn actuando en elShow, de forma que para todo aquel beanque tenga nombre (y por lo tanto, mtodo
getNombre()), se genere un mensaje porpantalla notificando que fulanito haactuado.
Para ello, habr que
desarrollar el postprocesador darlo de alta en el contenedor
Ejemplo: Con haciendahemos topado
H i d P tP
7/31/2019 01. Spring Framework
87/159
public classHaciendaPostProcessorimplementsBeanPostProcessor {@Override
public ObjectpostProcessAfterInitia
lization(Object bean
HaciendaPostProcessor
HaciendaPostProcessor
7/31/2019 01. Spring Framework
88/159
Y lo damos de alta en el contenedor
Resuelto en Piloto 24.0
Taller prcticoDescargar el piloto 24.0Importarlo en Eclipse
Examinar el cdigo fuente
HaciendaPostProcessor
Taller prctico: De mal en
7/31/2019 01. Spring Framework
89/159
Ahora llega la SGAE!Extender el piloto par aadir un nuevo bean
postprocesador SGAEPostProcessor quesaque por pantalla todos aquellos temas que
se toquen en el Show, intentando acceder almtodo getTema de cada bean declarado enel mismo.
(Ser necesario aadir el mtodo getTema()
a los que ya cuentan con setTema())(Resuelto en piloto 25.0).
ppeor
Postprocesamiento de la
7/31/2019 01. Spring Framework
90/159
Similar al BeanPostProcessor, elBeanFactoryPostProcessor permite realizartareas de postprocesamiento sobre todo elcontenedor de Spring.
public interface BeanFactoryPostProcessor {void postProcessBeanFactory(
ConfigurableListableBeanFactory beanFactory)
throws BeansException;
}
El mtodo postProcessBeanFactory esinvocado por Spring una vez las definicioneshayan sido cargadas, pero antes de que losbeans sean instanciados.
pfactora
Postprocesamiento de la
7/31/2019 01. Spring Framework
91/159
Ejemplo: Para saber cuantos beans han sidodeclarados en el beans.xmlpublic class BeanCounter implements BeanFactoryPostProcessor {
private Logger LOGGER = Logger.getLogger(BeanCounter.class);
public void postProcessBeanFactory(
ConfigurableListableBeanFactory factory) throwsBeansException {
LOGGER.debug("BEAN COUNT: " +factory.getBeanDefinitionCount());
}
}
Para darlo de alta en el contenedor.
7/31/2019 01. Spring Framework
92/159
Es posible configurar los beans mediante elbeans.xml y el elemento .Sin embargo, no conviene mezclar el
cableado de beans con la configuracin
especfica de nuestra aplicacin.Spring proporciona el objeto
PropertyPlaceholderConfigurer si trabajamoscon el ApplicationContext para esto.
7/31/2019 01. Spring Framework
93/159
Puede que necesitemos modular laconfiguracin en diferentes ficheros depropiedades:
jdbc.propertiessecurity.properties
application.properties
configuracin de los beans
Externalizando la
7/31/2019 01. Spring Framework
94/159
Ahora podemos recuperar los valores deconfiguracin referencindolos por medio devariables en lugar de tenerloshardcodeados en el beans.xml
7/31/2019 01. Spring Framework
95/159
configuracin de los beans
Taller prctico
7/31/2019 01. Spring Framework
96/159
Extender el piloto 25.0 para que tome lossiguientes datos del ficheroConfiguracion.properties:
numero.malabares=25tema=19 das y 500 noches
(Resuelto en piloto 26.0)
Taller prctico
7/31/2019 01. Spring Framework
97/159
Quin Soy?:
7/31/2019 01. Spring Framework
98/159
Implementando la interfaz BeanNameAwarele estoy diciendo al contenedor quequeremos que nos inyecte el identificadorcon el que el bean ha sido declarado en el
beans.xmlpublic interface BeanNameAware {void setBeanName(String name);
}
Cuando cada bean sea cagado, el
contenedor comprobar por introspeccin siimplementa esta interfaz ( isInstanceOf()).
En tal caso, invocar su mtodosetBeanName() pasndole como parmetro el
identificador del bean
yBeanNameAware
De dnde vengo?:B F t A &
7/31/2019 01. Spring Framework
99/159
De la misma forma, accedemos a la factoray al contexto:
public class StudentServiceImpl implements StudentService,ApplicationContextAware
{private ApplicationContext context;
public void setApplicationContext(ApplicationContext context){
this.context = context;
}
}
BeanFactoryAware &ApplicationContextAware
Taller prctico
7/31/2019 01. Spring Framework
100/159
Modificar el piloto 26.0 par que: La clase Malabarista reciba y almacene
ContextoLa factoraSu nombre
Forzar adems a que cuando reciba su nombre,muestre un mensaje diciendo:
Hola, me llamo actor
(Resuelto en piloto 27.0)
Taller prctico
Gestin de Eventos en
7/31/2019 01. Spring Framework
101/159
La inyeccin de dependencias no es la nicaforma de interaccin entre beans en Spring.La otra alternativa es basarse en el modelo
de eventos de los JavaBeans.Un bean publicador dispara un evento que
ser recibido por todos aquellos que estnregistrados como escuchadores.
El publicado y los escuchadores (listeners)
no se conocen entre s, estndesacoplados.
Spring
Gestin de Eventos en
7/31/2019 01. Spring Framework
102/159
Es Spring un bean puede ser Publisher Listener
Ambos dos.
Spring
Creacin de eventos
7/31/2019 01. Spring Framework
103/159
Un evento para poder ser gestionado porSpring debe extender la claseApplicationEvent.
public class CourseFullEvent extendsApplicationEvent {
private Course course;
public CourseFullEvent(Object source, Course course) {super(source);
this.course = course;
}
public Course getCourse() {
return course;
}
}
Creacin de eventos
Publicacin de Eventos
7/31/2019 01. Spring Framework
104/159
Una vez creado Cmo lo publicamos?El objeto ApplicationContext tiene el
mtodo publishEvent(), que nos permitepublicar instancias de la clase
ApplicationEvent.Todo aquel bean ApplicationListener
registrado en el contenedor recibir elevento mediante una llamada a su mtodo
onApplicationEvent()ApplicationContext context = ;
Course course = ;
context.publishEvent(new CourseFullEvent(this, course));
Problema: Necesitamos hacer que un bean sea
ca a de rocesar eventos
Publicacin de Eventos
Ser Listener
7/31/2019 01. Spring Framework
105/159
Para que un bean dado de alta en elcontenedor reciba eventos que extiendan laclase ApplicationEvent, deber implementarla Interfaz ApplicationListener
Public interface ApplicationListener
{
public void onApplicationEvent(ApplicationEvent event);
}
El contenedor detecta que es listenerde los
eventos y lo aade automticamente a lasuscripcin.
Ser Listener
Taller prctico
7/31/2019 01. Spring Framework
106/159
Extender el piloto 27 para que: Aparezca una clase Representante y un bean de
su tipo declarado en el contendor. Aparezca un evento PaseEvent con un mtodo
getActor() que retorne la instancia de Actor queacta en el Show.
El bean Show lance un evento PaseEvent por cadaactor que acte para que el Representante loescuche y tome nota de cuanto debe facturar al
gestor.(Resuelto en el piloto 28.0)
Taller prctico
Taller prctico
7/31/2019 01. Spring Framework
107/159
El show va a ser retransmitido por televisin,y por lo tanto, es necesario avisar al tcnicode control para que cuando termine unaactuacin importante, pase a publicidad, y
cuando comience la siguiente importante,retome la conexin con el escenario.La tele slo se interesa por las grandes
personalidades como Kenny G y Bill Clinton,
pero para mantener al pblico viendo losanuncios, los ponemos al comienzo y fin deespectculo.
Para modelar esto, vamos a necesitar crear
dos tipos de eventos diferentes que
Taller prctico
Taller prctico
7/31/2019 01. Spring Framework
108/159
Tendremos que: Creamos dos nuevos eventos:ComienzoVIPEvent con una propiedad ActorFinVIPEvent
Modificar la clase Show para que cuandocomiencen bill o kenny se dispare elcorrespondiente evento, as como cuandofinalicen.
Implementar TecnicoTelevision y dar de alta al
bean urdazi como tal. Tiene que ser capaz deescuchar eventos de tipo ApplicationEvent, ypublicar los mensajes de inicio y fin de laretransmisin, dependiendo del evento que lellegue.
Resuelto en piloto 28.5
Taller prctico
7/31/2019 01. Spring Framework
109/159
Haga clic para modificar el estilo de subttulo delpatrn
Spring AOP
Programacin Orientada a Aspectos
Definicin de POA
7/31/2019 01. Spring Framework
110/159
Definicin de POA
Fue presentada en pblico por GregorKickzales y su equipo de investigacin dePalo Alto Research Center en 1996.
Paradigma de programacin relativamentereciente.
De esta forma se consigue: Razonar mejor sobre los conceptos. Eliminar la dispersin del cdigo. Implementaciones resultan ms comprensibles,
adaptables y reusables.
Definicin de Aspecto
7/31/2019 01. Spring Framework
111/159
Definicin de Aspecto
Un aspecto es una unidad modular que sedisemina por la estructura de otras unidadesfuncionales. Los aspectos existen tanto en la
etapa de diseo como en la de
implementacin. Un aspecto de diseo es unaunidad modular del diseo que seentremezcla en la estructura de otras
partes del diseo. Un aspecto de programa o
de cdigo es una unidad modular delprograma que aparece en otras unidadesmodulares del programa (G. Kiczales)
Definicin de Aspecto
7/31/2019 01. Spring Framework
112/159
Definicin de Aspecto
Los aspectos son la unidad bsica de la POA, y
pueden definirse como las partes de unaaplicacin que describen las cuestiones clavesrelacionadas con la semntica esencial o elrendimiento.
Tambin pueden verse como los elementos quese diseminan por todo el cdigo y que sondifciles de describir localmente con respectoa otros componentes.
Ej.: patrones de acceso a memoria, sincronizacinde procesos concurrentes, manejo de errores, etc.
7/31/2019 01. Spring Framework
113/159
Estructura de un Programa OA
7/31/2019 01. Spring Framework
114/159
Estructura de un Programa OA
Se muestra un programa como un todoformado por un conjunto de aspectos msun modelo de objetos.
Con el modelo de objetos se objetos se
recoge la funcionalidad de negocio.Los aspectos recogen caractersticas de
rendimiento, infraestructura y otras norelacionadas con el modelo de negocio.
Objetivos Fundamentales de laPOA
7/31/2019 01. Spring Framework
115/159
POA
Extraer y centralizar en un solo puntolos "crosscutting concepts cada decisinse toma en un lugar concreto y nodiseminada por la aplicacin.
Minimizar las dependencias entre ellosdesacoplar los distintos elementos queintervienen en un programa.
Objetivos Fundamentales de la POA
Id i i l t li l
7/31/2019 01. Spring Framework
116/159
Idea principal es centralizar en un solopunto todos los aspectos comunes a las
clases que forman el sistema software.
Figura 1. Evolucin de unsistema OO a uno OA
Ventajas de la POA
7/31/2019 01. Spring Framework
117/159
e ajas de a O
Un cdigo menos enmaraado, ms naturaly ms reducido.
Mayor facilidad para razonar sobre los
conceptos, ya que estn separados y lasdependencias entre ellos son mnimas.
Un cdigo ms fcil de depurar y ms fcil
de mantener.
Ventajas de la POA
7/31/2019 01. Spring Framework
118/159
j
Se consigue que un conjunto grande demodificaciones en la definicin de unamateria tenga un impacto mnimo en lasotras.
Se tiene un cdigo ms reusable y que sepuede acoplar y desacoplar cuando seanecesario.
Programa Tradicional Vs. OA
7/31/2019 01. Spring Framework
119/159
g
Conceptos Bsicos de POA
Punto de enlace Una posicin bien definida dentro del cdigo orientado
7/31/2019 01. Spring Framework
120/159
Punto de enlace(Join Point)
Una posicin bien definida dentro del cdigo orientadoa objetos, por ejemplo, la declaracin de un mtodo.
Punto de corte(Pointcut)
Un conjunto de condiciones aplicadas a un punto deenlace que, al cumplirse, activarn el punto de corte yse ejecutar el punto de ejecucin asignado a dichopunto de corte.
Punto de ejecucin
o consejo (Advice)
Fragmento de cdigo que se ejecuta cuando se activa
un punto de corte.
Aspect
o
Otros Conceptos de POA
7/31/2019 01. Spring Framework
121/159
Objetivo (target) El objetivo o target es el objeto sobre el que se va a aplicar elaspecto, (Advised object), el objeto aconsejado.
Proxy Es el objeto resultante tras aplicar el Advice al objeto objetivo.Desde el punto de vista del cliente, el objeto objetivo (preAOP)y el objeto Proxy (postAOP) son el mismo (transparente)
Weaving Tejido de aspectos: Proceso por el cual se mezcla el cdigo delmodelo OO con los aspectos involucrados en su ejecucin
7/31/2019 01. Spring Framework
122/159
Fundamentos de la POA
7/31/2019 01. Spring Framework
123/159
Para tener un programa orientado a aspectos
necesitamos definir los siguienteselementos: Un lenguaje para definir la funcionalidad bsica.
Este lenguaje se conoce como lenguaje base.
Suele ser un lenguaje de propsito general, talcomo C++, C# o Java. En general, se podranutilizar tambin lenguajes no imperativos.
Uno o varios lenguajes de aspectos. Ellenguaje de aspectos define la forma de los
aspectos, por ejemplo, los aspectos deAspectJ seprograman de forma muy parecida a las clases.
Un tejedor de aspectos.
Fundamentos de la POA
7/31/2019 01. Spring Framework
124/159
Los puntos de enlace son una claseespecial de interfaz entre los aspectos y losmdulos del lenguaje de componentes.Son los lugares del cdigo en los que stese puede aumentar con comportamientosadicionales. Estos comportamientos seespecifican en los aspectos.
Fundamentos de la POA
7/31/2019 01. Spring Framework
125/159
El encargado de realizar este proceso demezcla se conoce como tejedor (deltrmino ingls weaver).
Se encarga de mezclar los diferentes
mecanismos de abstraccin y composicinque aparecen en los lenguajes de aspectos ycomponentes ayudndose de los puntos deenlace.
El proceso de mezcla se puede retrasar parahacerse en tiempo de ejecucin, o hacerseen tiempo de compilacin.
Implementacin en Lenguajes
7/31/2019 01. Spring Framework
126/159
Estructura de unaimplementacin en
los lenguajes tradicionales.
p g j
Implementacin en lenguajes
7/31/2019 01. Spring Framework
127/159
Estructura de unaimplementacin
en los lenguajes de aspectos.
Tipos de enlazado(Weaving)
7/31/2019 01. Spring Framework
128/159
Los aspectos son tejidos en los objetosobjetivo en los puntos de enlazadoespecificados (joinpoints).
Puede ser en tres momentos de la vida del
objeto: Tiempo de compilacin El cdigo fuente del
objetivo es enriquecido con el cdigo de losaspectos en los joinpoints, y luego compilado. AstrabajaAspectJ
Durante la carga de clases Los aspectos seenlazan en el momento de la carga de clases. Serequiere un ClassLoader especial.
En tiempo de ejecucin Aplicando el patrn
Proxy se intercepta la peticin y se delega en los
(Weaving)
Qu nos permite SpringAOP?
7/31/2019 01. Spring Framework
129/159
Los advices en Spring estn escritos en Java Podemos usar IDEs corrientes Conocemos el lenguaje
Los pointcuts se declaran en un fichero XML
Estndar conocido. AspectJ requiere una sintaxisespecial.Spring realiza el tejido de aspectos en
tiempo de ejecucin, sirvindose del patrn
Proxy.
Soporte de Spring
Funcionamiento de SpringAOP
7/31/2019 01. Spring Framework
130/159
La ejecucin el objeto acosejado por elaspecto es interceptada por un objeto Proxyque realiza las labores definidas en elpointcut.
Los proxies sern creados por elApplicationContext cuando carga los beansdeclarados en el contenedor.
Dado que se crean en tiempo de ejecucin,
no se necesita ningn compilador especficopara AOP con Spring.
AOP
Tipos de intercepcin
7/31/2019 01. Spring Framework
131/159
Dos tipos: La clase aspectizada implementa un interfaz quecontiene los mtodos por los que se van a realizarlos pointcuts
Spring usa la java.lang.reflect.Proxy para generar
automticamente una nueva clase que implementa laineterfaz, teje los aspectos e intercepta toda llamadaa esos mtodos de la interfaz.
La clase es un POJO. Spring usa CGLIB paragenerar un proxy a medida en tiempo de
compilacin, extendiendo la clase objetivo (por loque no podemos usar mtodos final.)
p p
AOP Alliance Interfaces
7/31/2019 01. Spring Framework
132/159
Spring implementa las interfaces de AOPAlliance: Acuerdo para promover un uso estandarizado de
la AOP independientemente de la tecnologa(Java) subyacente sobre la que se generen los
aspectos. Un aspecto creado con estos interfaces es
portable a otras plataformas AOP
Puntos de unin en Spring
7/31/2019 01. Spring Framework
133/159
Spring slo soporta Method JoinpointsOtras plataformas (AspectJ, Aspect JBOSS)soportan field joinpoints, lo que permiteaspectos ms refinados.
No obstante, si todos los accesos a atributosse realizan por medio de los mtodosaccessor, se pueden emular los efectos.
p g
Tipos de advices
7/31/2019 01. Spring Framework
134/159
Tipo Interface Descripcin
Around org.aopalliance.intercept.MethodInterceptor Intercepta lasllamadas al mtodo
Before org.springframework.aop.BeforeAdvice Se invoca antes deque el mtodo seainvocado
After org.springframework.aop.AfterReturningAdvice Se invoca tras almtodo
Trhows org.springframework.aop.ThrowsAdvice Se invoca cuando el
objetivo dispara unaexcepcin.
Mi primer aspecto
7/31/2019 01. Spring Framework
135/159
Vamos a probar los aspectos extendiendo elEspectculo que ya tenemos funcionando,haciendo que aparezca un nuevo actor: el pblico.
Antes de nada, bajamos de la zona de descargasel jar de la CGLIB y lo aadimos en lib y al
classpath del proyecto actual.Creamos una clase Audiencia con los siguientes
mtodos, y la declaramos como el beanaudiencia en el beans.xml:
Mtodo Muestra el mensajetomenAsiento() El pblico se sienta
apagueMoviles()El pblico apaga sus mviles
a laudan CLAP CLAP CLAP CLAP!!!!! B AVO!!!!!
Mi primer aspecto
7/31/2019 01. Spring Framework
136/159
Ahora... Quin invoca a la clase audiencia?El pblico no va dirigido ni por el actor deturno, ni por el propio espectculo, sino queresponden a situaciones automticamente.
Vamos a crear un aspecto para que disparelos mtodos del bean audiencia antes ydespus de cada actuacin de un actor.
Implementando el aspecto
7/31/2019 01. Spring Framework
137/159
Creamos una nueva clase Javaes.uniovi.si.aop.AudienciaAdvice, deforma que: Implemente:AfterReturningAdviceMethodBeforeAdviceThrowsAdvice
Tenga una propiedad audiencia para poderobtener una referencia a la misma por inyeccin.
Implementamos los tres mtodos, invocando a losmtodos de audiencia que corresponda en cadacontexto.
Implementando el aspecto
7/31/2019 01. Spring Framework
138/159
Una vez creada la clase AudiencieAdvise,damos de alta el bean audiencieAdviceinyectando la audiencia como propiedad.
Ahora tenemos que definir el punto de corte.
Con el punto de corte le diremos a Springdonde exactamente queremos aplicar eladvice que hemos implementado.
Spring permite utilizar varios tipos de puntos
de corte.
Declarando un punto decorte con expresiones
7/31/2019 01. Spring Framework
139/159
Objetivo: seleccionar los mtodos sobre losque aplicar el advise.Solucin: Aplicacin de un patrn de
expresiones regulares sobre la signatura de
los mtodosSpring incorpora dos clases que
implementan estos puntos de corte: org.springframework.aop.support.Perl5RegexpMet
hodPointcut (Requiere Jakarta ORO) org.springframework.aop.support.JdkRegexpMeth
odPointcut (Usa el RegExp incorporado en Java1.4)
regulares.
Declarando un punto decorte con expresiones
7/31/2019 01. Spring Framework
140/159
Para utilizar el punto de corte, primerotenemos que declararlo como bean en elcontenedor:
7/31/2019 01. Spring Framework
141/159
Ahora tenemos que asociar el punto de cortecon el advice:
Con esto ya tenemos el aspecto completoimplementado. Para que funcione, nos faltaun ltimo paso, la creacin de los objetos
proxy de los beans que queremosaspectizar
advice
Creacin de los Proxies
7/31/2019 01. Spring Framework
142/159
Para todo bean aconsejado por un advisor,es necesario crear un proxy.El proxy es el que realmente actuar cuando
el advisor haga su trabajo, y por lo tanto, es
el que realmente debemos cablear.Para crear un proxy para el kenny, por
ejemplo:
Creacin del proxy para losbeans aspectizados
7/31/2019 01. Spring Framework
143/159
7/31/2019 01. Spring Framework
144/159
Modificar el piloto 29.0 para que la guitarradispare irremisiblemente una excepcin detipo Runtime() y comprobar que el pblicopide su devolucin.
(Resuelto en piloto 30.0)
Taller prctico Elvigilante de seguridad
7/31/2019 01. Spring Framework
145/159
La organizacin del espectculo estpreocupada por los controles de inmigracinque la seguridad social est realizando sinprevio aviso, as que decide poner un
vigilante que, antes de cada actuacin, lepida las credenciales a los artistas paradejarles trabajar o no.
Tendremos que seguir los siguientes pasos...
vigilante de seguridad
Taller prctico Elvigilante de seguridad
7/31/2019 01. Spring Framework
146/159
Aadir a Actor un mtodo getCredencialesque retorne un boolean (indicando si lastiene o no).
Creamos es.uniovi.si.VigilanteAdvise para
que implemente BeforeAdvise, y lo damos dealta como vigilanteAdvise.Implementamos el mtodo before para que
muestre un mensaje indicando si el target
(tercer parmetro del mtodo) tiene o nocredenciales.El punto de corte... Ya lo tenemos declarado!
Ser el mismo que para el ejemplo anterior
Asociamos el nuevo advisor con el unto de
vigilante de seguridad
Taller prctico Probandoal vigilante
7/31/2019 01. Spring Framework
147/159
A partir del piloto 31.0, modificarlo para que: el malabarista no tenga credenciales El vigilante lance una excepcin de tipo
InmigranteIlegalExcepcion avisando de que nopuede trabajar.
EjecutarloQu ha ocurrido? Dnde deberamos
capturar la excepcin para que la aplicacinsiga funcionando?
Capturarla en el lugar adecuado y mostrarun mensaje de la organizacin explicando lacancelacin de la actuacin.
(Resuelto en piloto 32.0)
al vigilante
7/31/2019 01. Spring Framework
148/159
Haga clic para modificar el estilo de subttulo delpatrn
Ponindolo en prctica
Aplicando Spring
7/31/2019 01. Spring Framework
149/159
Vamos a comenzar la implementacin deuna infraestructura base basada en Springpara el desarrollo de aplicaciones.
Desarrollaremos el esqueleto de una
aplicacin modelo sirvindonos de Springpara ahorrarnos cdigo que solemos tenerque implementar para cada aplicacin.
Primer paso: Preparandoel entorno
7/31/2019 01. Spring Framework
150/159
Partir del ltimo piloto manipulado y: Eliminar todas las clases menos la factora Dejar el beans.xml sin ningn bean para poder
empezar de cero.Vamos a partir de un entorno vaco sobre el
cual trabajar.Implementar la clase Main con mtodo main
y mtodo comienzo. El main obtendr una
referencia a s mismo por medio de lafactora e invocar su mtodo comienzo.
el entorno
Desarrollando el men
7/31/2019 01. Spring Framework
151/159
Queremos desarrollar un men configurableque valga para cualquier aplicacin deventanas.
Cada elemento del men (MenuItem)
contendr una descripcin (description) yuno o varios subelementos, que serninyectados por Spring.
Configurarlo para que de momento tenga la
siguiente estructura:
Desarrollo del men
7/31/2019 01. Spring Framework
152/159
Finalmente, implementar un mtodo printMenu en la
clase Main que pinte tabuladamente las diferentesopciones del men invocando el toString() demuniItem.
(Resuelto en piloto 40.0)
Inyectando lgica en elmen
7/31/2019 01. Spring Framework
153/159
Vamos a aplicar el patrn command. Paraello: Implementaremos un interface
es.uniovi.si.menu.MenuCommand que contengaun mtodo execute.
Prepararemos el MenuItem para que:Pueda recibir uno o varios Command por inyeccin, y
los invoque en orden de inyeccin en un mtodo run Creamos un comando (ejemplo,
es.uniovi.si.comandos.AbrirCommand) para cadaopcin final del men que de momento slomostrar un mensaje cuando se invoque, y losinyectamos en su correspondiente opcin delmen.
(Resuelto piloto 41 0)
men
Activando y desactivandomens
7/31/2019 01. Spring Framework
154/159
Aadir a MenuItem una propuedad boolean active SIN INICIALIZAR, y
modificarlo para que si vale false, el nombre del men aparezca entre * alllamar al toString(). Ej: *Abrir* Crear los eventos:
es.uniovi.si.menu.event.AuthorizeMenuItemsEvent es.uniovi.si.menu.event.DenyMenuItemsEvent es.uniovi.si.menu.event.AuthorizeAllMenuItemsEvent es.uniovi.si.menu.event.DenyAllMenuItemsEvent
de forma que los dos primeros contengan una coleccin con los ids (tal ycomo han sido asignados en el beans.xml) de los mens a activar o desactivar. Crear una clase MenuController, que implemente los mtodos
autorizeMenuItems() denyMenuItems() authorizeAll() denyAll()
de forma que se sirva de los eventos para activar o desactivar las opcionesdel men que le soliciten cambiar. Las dos primeras podrn recibir uno o variosids de tipo String. Lo instanciamos como el bean menuController y se lo inyectamos a Main
mens
Activando y desactivandomens
7/31/2019 01. Spring Framework
155/159
Configurar el men para que por defecto, todoslos mens estn activos (uno a uno?), y cambiarlo necesario para que el menpegaraparezcadesactivado.
Para probarlo, modificar el mtodo comienzo de
Main para que:Pinte el menDesactive el men de cortarPinte el menActive todas las opcionesPinte el men
(Resuelto en piloto 42.0)
mens
Refactorizando
7/31/2019 01. Spring Framework
156/159
A estas alturas, decidimos que el no tienesentido que Main contenga directamente elmen ni que implemente el mtodoprintMenu().
Refactorizamos la aplicacin para que sea elMenController el que contenga amboselementos, de forma que el Main slointeracte con el menController.
(Resuelto en piloto 43.0)
Servicio de Log
7/31/2019 01. Spring Framework
157/159
Aadir un servicio de log tal que: La interfaz de acceso seaes.uniovi.si.infraestructura.log.Log y tenga losmtodos:log
warnerrorfatalError
La clase que lo implemente seaes.uniovi.si.infraestructura.log.MiLog
La clase Main tenga acceso al log y muestre unmensaje para corroborar que funciona.
Implementamos el LogAdvice para que:
Aspectizando el log
7/31/2019 01. Spring Framework
158/159
Implementamos el LogAdvice para que: Al entrar trace un mensaje notificando que se ha invocado el
mtodo X de la clase Y con los argumentos Z Al salir muestre un mensaje notificando el final del mtodo X de
la clase Y retornando Z Al capturar una excepcin notifique un error.
Creamos la interfaz MenuItemInterface, dado que para
interceptar las invocaciones el advice requiere un interfaz(que luego implementar el Proxy). Ahora el MenuItemcontendr elementos de tipo MenuItemInterface (lo hacesolo eclipse!)
Creamos el pointcut para que capture invocaciones a los
mtodos run de los mens Modificar el printMenu para que invoque cada mtodo run. Aspectizamos menuAbrir y probamos.
(Resuelto en piloto 44.0)
Aspecto de seguridad
7/31/2019 01. Spring Framework
159/159
Implementamos ahora un aspecto materializadoenes.uniovi.si.infraestructura.security.SecurityAdvice de forma que:
Reciba un objeto de tipo User en un atributo usuario
con un mtodo getUser que retorne el id del usuario. Reciba un String[] con los usuarios autorizados a
ejecutar la aplicacin Prepararlo para que antes de la invocacin del mtodo
interceptado compruebe que el usuario tiene permisos
para usar la aplicacin Se dispare antes de cada comando del men