inyección de dependencia
DESCRIPTION
En el desarrollo de grandes aplicaciones empresariales, la dependencia entre módulos es uno de los más grandes problemas. Módulos fuertemente acoplados aceleran la entropía de un sistema, provocando rigidez, fragilidad, inmovilidad y dificultando el mantenimiento y escalamiento del código fuente. La inyección de dependencia es un patrón de diseño que sirve para reducir el acoplamiento entre dos o más módulos y facilitar la administración de dependencias. En esta charla se verán los conceptos fundamentales de Contenedores, Inversión de Control e Inyección de Dependencia, mostrando diferentes implementaciones, entre ellas Spring y Java EE, concluyendo en una comparación entre ambas tecnologías de punta.TRANSCRIPT
● Proyecto Base● Conceptos● Spring● Java EE● Spring V.S. Java EE
Agenda
Proyecto Base
Modelo de Dominio
Repositorio de Proyectos
Arquitectura de 3 capas
Buscar Proyecto por Nombre (1)
Buscar Proyecto por Nombre (1)
Buscar Proyecto por Nombre (2)
Buscar Proyecto por Nombre (2)
Conceptos
● Rigidez○ Dificultad para implementar cambios
● Fragilidad○ Tendencia a romperse con cada cambio
● Inmovilidad○ Inhabilidad de reutilizar el código
● Viscosidad○ Del Diseño: los hacks son muy sencillos○ Del Ambiente: lento e ineficiente
Síntomas de un Diseño Corrompido
● Cambios en los Requerimientos○ Inicialmente no contemplados
● Administración de Dependencias○ Es la arquitectura de dependencias la que
se va degradando
Causas que Aceleran la Entropía
● Cambios en los Requerimientos○ Inicialmente no contemplados
● Administración de Dependencias○ Es la arquitectura de dependencias la que
se va degradando
LAS DEPENDENCIASSON MALAS!!!
Causas que Aceleran la Entropía
● Con el uso de interfaces, buscamos invertir el control
● Al trabajar con interfaces y no contra las implementaciones, invertimos el control de la ejecución del código
● En camino a un Diseño Declarativo
Inversión de Control (IoC)
Buscar Proyecto por Nombre (2)
DIP Ad-Hoc
● Los componentes deben depender de abstracciones, no de implementaciones concretas
● Las dependencias que una clase tiene no deben ser asignadas por ella misma sino por un agente externo (Contenedor)
● Inyección de Dependencia● Reflection, Spring, EJB, CDI
Inyección de Dependencia (DIP)
Dependencia por Configuración
● Don't call us, we'll call you● Relacionado con IoC y DIP● Favorece el Bajo Acoplamiento● Favorece la Alta Cohesión
Principio de Hollywood
spring.io
Algunos Proyectos Spring.io● Spring Framework● Spring Boot● Spring Data / Spring XD● Spring Integration● Spring Security● Spring Social● Spring Mobile● Groovy / Grails● Spring MVC / Webflow
DIP Spring
Contextos de Spring● Singleton (una única instancia)● Prototype (sin estado)● Request (para HTTP Request)● Session (para HTTP Session)● Global Session (para Portlets)
Java Enterprise Edition
Algunas Especificaciones Java EE
DIPJava EE (CDI)
Contextos de CDI● RequestScoped (para HTTP Request)● SessionScoped (para HTTP Session)● ApplicationScoped (como singleton)● ConversationScoped (long-running)
● Singleton (similar a ApplicationScoped)● Dependent (atado al bean al que
pertenece; scope default)
Spring V.S. Java EE
Reglas para Comparar (1)● Comparar versiones equivalentes
○ Ejemplo: Spring 3 V.S. Java EE 6● Comparar usando el stack completo:
○ Java EE != EJB y Spring != IoC● No comparar usando Liviano y Pesado:
○ Java EE ya no es más Pesado○ Spring ya no es más Liviano
● La importancia de las especificaciones:○ A menudo Spring usa Java EE
● Ambas plataformas son modulares○ Java EE: Modularización a nivel AS○ Spring: Modularización a nivel Maven
● Ambos plataformas son extensibles○ Ambos pueden integrarse con otros
proyectos○ Spring puede integrarse con Java EE○ Java EE puede integrarse con Spring
Reglas para Comparar (2)
● ¿La era de los Frameworks ha terminado?● La innovación sigue estando en los
Frameworks y Librerías● Ejemplos de Frameworks y Librerías que
se hicieron especificación:○ Hibernate → JPA○ Seam → CDI
Framework V.S. Especificación
● JBoss EAP 6.1: 115.5 Mb● Spring Framework 3.2.3 + Tomcat 7.0.43:
114.1 Mb
Portabilidad
● Write Once, Run Everywhere● Implementaciones Java EE:
○ JBoss AS / WildFly (Red Hat)○ TomEE (Apache)○ Glassfish (Oracle)○ Weblogic (Oracle)○ Websphere (IBM)
● Implementaciones Spring:○ Spring.io (joint venture: EMC Corporation y
VMWare)
Vendor Lock-In
● Robert C. Martin - Principios SOLID● Martin Fowler - Contenedores● http://howtojboss.com/● http://elblogdelfrasco.blogspot.com.ar/
Bibliografía
● Código Fuente:○ https://github.
com/elfrasco/dependency-injection
http://www.epidataconsulting.com/[email protected]
Muchas Gracias