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 ?
• Mar)n Fowler
Books
• Pa2erns of Enterprise Applica)on Architecture
• Domain Specific Languages
• Analysis Pa2erns: 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. Applica)on 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
28. Contenedor IOC
• Object.
• Object Factory: Crea y administra los objetos
–factory.getObject("myObject").
• Object Defini)on
• Applica)on 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”) != factory.getObject(“obj”)
24
30. Con guración
• MXML
– Compilado como parte de la aplicación.
– AppContext.mxml.
<Objects>
<app:Applica)onModel id=“appModel” />
<app:Applica)onController id=“appController”
applica)onModel=“{appModel}”/>
</Objects>
25
31. Con guración
• XML
– Configuración externa.
– Ejecutada al inicio de la aplicación.
<objects>
<object id=“appModel”
class=“com.domain.app.Applica)onModel”/> <object
id=“appController”
class=“com.domain.app.Applica)onController”>
<property name=“applica)onModel” ref=“appModel”/>
<objects>
26
36. Operation API
• Problema: obtener un usuario.
interface IUserRepository {
func)on getUser(id:int): ???
}
• Que debe devolver el método getUser?
AsyncToken(Flex/RemoteObject), User, Void
31
37. Operation API
• Spring AS: devolver un IOpera)on.
interface IUserRepository {
func)on getUser(id:int): IOpera)on
}
• Una “operacion” es u)lizada para denotar un
comportamiento asíncrono.
• IOpera)on es una interfaz con métodos
“complete” y “error” cuando
32