2. Nosotros
Ivan Alvarez
Adobe Certi ed Expert Flex & AIR
Senior RIA Developer
@Ivanhoe
email
ivan.alvarez@tidyslice.com
2
3. Nosotros
Daniel Ramos
Adobe Certi ed Instructor Flex & AIR
Senior RIA Developer
@dannyGeek
email
daniel.ramos@tidyslice.com
3
4. Descripción
Eliminating Enterprise Java Complexity.
Made programming painless
Become a Superstar
IoC: Es un principio abstracto que describe un aspecto
de algunos diseños de arquitectura de software en el
que se invierte el ujo de control de un sistema en
comparación con la programación procedimental .
4
5. Descripción
Principio de Hollywood, “No nos llames, nosotros te
llamamos”
5
6. Quién inicio IOC ?
• Martin Fowler
Books
• Patterns of Enterprise Application Architecture
• Domain Specific Languages
• Analysis Patterns: Reusable Object Models
6
7. Por qué IOC ?
Te permite ensamblar un sistema a partir de sus partes.
In the Java community there's been a rush of lightweight containers that help to assemble
components from different projects into a cohesive application. Underlying these containers is a
common pattern to how they perform the wiring, a concept they refer under the very generic name
of "Inversion of Control". Martin Fowler. ref http://martinfowler.com/articles/injection.html
7
8. Por qué IOC ?
Las partes no se preocupan por encontrarse unas a otras
In the Java community there's been a rush of lightweight containers that help to assemble
components from different projects into a cohesive application. Underlying these containers is a
common pattern to how they perform the wiring, a concept they refer under the very generic name
of "Inversion of Control". I dig into how this pattern works, under the more specific name of
"Dependency Injection" ref http://martinfowler.com/articles/injection.html
8
9. Por qué IOC ?
Cualquier parte puede ser fácilmente sustituida
9
11. Application Context:
• Definición de Beans y sus dependencias
• Beans de infraestructura
• Definido en uno o más archivos .xml
11
12. • Contenedor IoC (Inversión de Control) usando Inyección de Dependencias.
“There are three main styles of dependency injection. The names I'm using for them are Constructor Injection, Setter Injection, and
Interface Injection.” Martin Fowler http://martinfowler.com/articles/injection.html#InversionOfControl
12
13. • Spring se encarga de crear los objetos e inyectar sus dependencias.
• Constructor o setter injection
• Los objetos son creados en el orden correcto basados en sus
dependencias
13
14. • Spring se encarga de crear los objetos e inyectar sus dependencias.
• Constructor o setter injection
• Los objetos son creados en el orden correcto basados en sus
dependencias
13
15. • Spring se encarga de crear los objetos e inyectar sus dependencias.
• Constructor o setter injection
• Los objetos son creados en el orden correcto basados en sus
dependencias
Bean B
13
16. • Spring se encarga de crear los objetos e inyectar sus dependencias.
• Constructor o setter injection
• Los objetos son creados en el orden correcto basados en sus
dependencias
Bean B
13
17. • Spring se encarga de crear los objetos e inyectar sus dependencias.
• Constructor o setter injection
• Los objetos son creados en el orden correcto basados en sus
dependencias
Bean A Bean B
13
18. • Spring se encarga de crear los objetos e inyectar sus dependencias.
• Constructor o setter injection
• Los objetos son creados en el orden correcto basados en sus
dependencias
Bean A Bean B
13
19. La inyección con Spring vía Constructor:
package x.y;
public class Foo {
public Foo(Bar bar, Baz baz) {
// ...
}
}
Configuracion Spring via XML
<beans>
<bean id="foo" class="x.y.Foo">
<constructor-arg ref="bar"/>
<constructor-arg ref="baz"/>
</bean>
<bean id="bar" class="x.y.Bar"/>
<bean id="baz" class="x.y.Baz"/>
</beans>
14
20. La inyección con Spring vía setter:
class MovieLister...
public MovieLister(MovieFinder finder) {
this.finder = finder;
}
class ColonMovieFinder...
public ColonMovieFinder(String filename) {
this.filename = filename;
}
Configuracion Spring via XML
<beans>
<bean id="MovieLister" class="spring.MovieLister">
<property name="finder">
<ref local="MovieFinder"/>
</property>
</bean>
<bean id="MovieFinder" class="spring.ColonMovieFinder">
<property name="filename">
<value>movies1.txt</value>
</property>
</bean>
</beans>
15
24. Evolución
Generación 1.0 Cairngorm Obsoleto
Spring AS
PureMVC
Generación 1.5 Madurez
Mate
Swiz Estado del arte
Generación 2.0
Parsley
Robotlegs
19
25. Plataformas
Flex & Flash Flex
Spring AS Mate
PureMVC Swiz
Parsley
RobotLegs
Cairngorm
20
26. Spring AS
• Contenedor IOC para AS3.
• Flash/Flex/AIR/AS3 puro.
• Christophe Herreman.
• Prana Framework.
21
27. Contenedor IOC
• Fábrica de objetos.
• Crea y ensambla objetos.
• Centraliza el manejo de dependencias.
• Configuración via XML o MXML.
22
28. Contenedor IOC
• Object.
• Object Factory: Crea y administra los
objetos
– factory.getObject("myObject").
• Object Definition
• Application Context: Fábrica de objetos
inteligente.
23
29. Contenedor IOC
• Object Scopes
– Singleton: Solo una instancia en el
contenedor.
• Default
• factory.getObject(“obj”) ==
factory.getObject(“obj”)
– Prototype
• Nueva instancia por cada request.
• factory.getObject(“obj”) !=
24
30. Con guración
• MXML
– Compilado como parte de la aplicación.
– AppContext.mxml.
<Objects>
<app:ApplicationModel
id=“appModel” />
<app:ApplicationController
id=“appController”
</Objects>
applicationModel=“{appModel}”/>
25
31. Con guración
• XML
– Configuración externa.
– Ejecutada al inicio de la aplicación.
<objects>
<object id=“appModel”
class=“com.domain.app.ApplicationModel”/>
<object id=“appController”
class=“com.domain.app.ApplicationController”
> <property name=“applicationModel”
ref=“appModel”/>
<objects>
26
32. Con guración
• XML Pros
– Diálecto mas rico que la configuración en
MXML.
– Flash/Flex/Air/AS3
– No es necesario recompilar.
– Familiar a usuarios de Spring
27
33. Arquitectura MVC
• Ninguna en particular.
• Realmente es necesaria?
• Alternativas: Cairngorm, PureMVC, Mate.
28
35. Operation API
• Comportamiento asíncrono en el Flash
Player:
• Carga de recursos externos
• WebServices
• HttpServices
• Unifica los APIS:
-AsyncToken, Responders, Callbacks,
30
36. Operation API
• Problema: obtener un usuario.
interface IUserRepository {
function getUser(id:int): ???
}
• Que debe devolver el método getUser?
AsyncToken(Flex/RemoteObject), User,
31
37. Operation API
• Spring AS: devolver un IOperation.
interface IUserRepository {
function getUser(id:int):
IOperation
}
• Una “operacion” es utilizada para
denotar un comportamiento asíncrono.
• IOperation es una interfaz con métodos
“complete” y “error” cuando
32
38. Event Bus
• Sistema de publicación/subscripción.
• Promueve el bajo acoplamiento.
• Eventos standard de
Flash(flash.events.Event)
33
39. Event Bus
• Subscripción a eventos.
– Escuchar todos los eventos.
• EventBus.addListener(listener:IEventBusListener);
• function onEvent(event:Event):void { }
– Escuchar solo ciertos eventos.
• EventBus.addEventListener(“anEvent”, handler);
• function handler(event:Event):void { }
34
40. Event Bus
• Publicación de eventos.
– Disparar eventos standart.
• EventBus.dispatchEvent(new
Event(“someEvent”));
– Dispara eventos personalizados.
• class UserEvent extends Event { ...}
• EventBus.dispatchEvent(new
UserEvent(UserEvent.DELETE, user));
35
41. Autowiring
• Inyección de dependencias via Metadata.
• Alambrado por tipo, nombre,
constructor, autodección.
• Disponible para objetos manejados por
el contenedor.
36
42. Autowiring
• Anotar una propiedad con [Autowired]
class UserController
{
[Autowired]
public var userRepository:IUserRepository;
}
[Autowired(name=“myObject“,
property=“prop”)]
37
43. Resumen
• Manejo de dependencias.
• Codificar hacia interfaces, bajo
acoplamiento.
• Filosofía Spring.
• Promueva buenas practicas.
38