01. spring framework

Upload: robert-cabeza

Post on 05-Apr-2018

227 views

Category:

Documents


0 download

TRANSCRIPT

  • 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.html
  • 7/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