Este documento describe el uso de Dependency Injection (DI) con Guice para gestionar las dependencias entre clases en una aplicación. Explica tres aproximaciones iniciales para DI (patrón fábrica, Service Locator, DI manual) y cómo Guice mejora esto proporcionando inyección de dependencias automática mediante anotaciones como @Inject. También cubre temas como módulos, proveedores, scopes y unit testing con DI.
Este documento presenta los principales beneficios de utilizar Flex e integración con BlazeDS para el desarrollo de aplicaciones web ricas. Explica cómo BlazeDS permite llamadas remotas a objetos Java desde Flex y el intercambio de mensajes entre clientes y servidor a través de servicios de mensajería. También cubre temas como subtemas, selectores y la integración con JMS.
Dependency injection design pattern is introduced in order to solve some common issues due to explicit wiring between a component and its collaborator or service.
Spring Framework and AngularJS are involved to show how dependency injection could simplify the way of writing code but above all testing.
Clean and concise code is obtained using DI. Real example are provided on Github and Plunkr.
Clean code via dependency injection + guiceJordi Gerona
The document discusses various code smells related to dependency injection and constructor usage, such as constructors doing real work instead of just setting fields, digging into collaborator objects instead of using their interfaces, and relying on global state and singletons. It provides examples of these code smells and proposes fixes using dependency injection and interfaces to make the code more testable and flexible.
The document provides an introduction to Hibernate and demonstrates a basic "Hello World" example using Hibernate. It shows how to define a persistent class, save and retrieve data from the database using Hibernate, and configure Hibernate via properties files or XML. Key aspects of the Hibernate architecture like the SessionFactory, Session, and Transactions are also explained at a high level.
Hibernate ORM: Tips, Tricks, and Performance TechniquesBrett Meyer
DevNexus 2014
Out-of-the-box, Hibernate ORM offers limited overhead and decent throughput. Early-stage applications enjoy the convenience of ORM/JPA with great performance. However, scaling your application into an enterprise-level system introduces more demanding needs.
This talk will describe numerous tips and techniques to both increase Hibernate ORM performance, as well as decrease overhead. These include some basic tricks, such as mapping and fetching strategies. Entity enhancement instrumentation, third-party second level caching, Hibernate Search, and more complex considerations will also be discussed. The talk will include live demonstrations techniques and their before-and-after results.
Este documento presenta los principales beneficios de utilizar Flex e integración con BlazeDS para el desarrollo de aplicaciones web ricas. Explica cómo BlazeDS permite llamadas remotas a objetos Java desde Flex y el intercambio de mensajes entre clientes y servidor a través de servicios de mensajería. También cubre temas como subtemas, selectores y la integración con JMS.
Dependency injection design pattern is introduced in order to solve some common issues due to explicit wiring between a component and its collaborator or service.
Spring Framework and AngularJS are involved to show how dependency injection could simplify the way of writing code but above all testing.
Clean and concise code is obtained using DI. Real example are provided on Github and Plunkr.
Clean code via dependency injection + guiceJordi Gerona
The document discusses various code smells related to dependency injection and constructor usage, such as constructors doing real work instead of just setting fields, digging into collaborator objects instead of using their interfaces, and relying on global state and singletons. It provides examples of these code smells and proposes fixes using dependency injection and interfaces to make the code more testable and flexible.
The document provides an introduction to Hibernate and demonstrates a basic "Hello World" example using Hibernate. It shows how to define a persistent class, save and retrieve data from the database using Hibernate, and configure Hibernate via properties files or XML. Key aspects of the Hibernate architecture like the SessionFactory, Session, and Transactions are also explained at a high level.
Hibernate ORM: Tips, Tricks, and Performance TechniquesBrett Meyer
DevNexus 2014
Out-of-the-box, Hibernate ORM offers limited overhead and decent throughput. Early-stage applications enjoy the convenience of ORM/JPA with great performance. However, scaling your application into an enterprise-level system introduces more demanding needs.
This talk will describe numerous tips and techniques to both increase Hibernate ORM performance, as well as decrease overhead. These include some basic tricks, such as mapping and fetching strategies. Entity enhancement instrumentation, third-party second level caching, Hibernate Search, and more complex considerations will also be discussed. The talk will include live demonstrations techniques and their before-and-after results.
Msdn Webcast InyeccióN De Dependencias Con Spring FrameworkGabriel Oliva
Este documento presenta una introducción al patrón de inyección de dependencias (IoC) y cómo se implementa a través del framework Spring. Explica los problemas de dependencias entre clases, alternativas como interfaces y fábricas de objetos, e introduce Spring como un contenedor IoC que resuelve dependencias mediante configuración. Spring ofrece características adicionales como AOP y soporte para datos, web y escritorio.
GWT es un framework de desarrollo de Google que permite crear aplicaciones web complejas usando Java. Los proyectos GWT tienen una estructura de paquetes separando el código del cliente y servidor, e incluyen módulos, clases EntryPoint y llamadas RPC para comunicación con el servidor. GWT compila el código Java a JavaScript para ejecutarse en el navegador, permitiendo desarrollar interfaces gráficas ricas sin refrescos de página.
Este documento describe el patrón de diseño Facade. Facade proporciona una interfaz simplificada para un subsistema complejo. Se usa Facade para ocultar la complejidad de un subsistema y hacerlo más fácil de usar para los clientes. El patrón involucra una clase Facade que delega las solicitudes de los clientes a las clases apropiadas del subsistema subyacente.
El documento describe cómo conectarse a una base de datos desde C# y cómo implementar el patrón arquitectónico Modelo Vista Controlador (MVC). Explica los pasos para conectarse a una base de datos usando ADO.NET y luego crea clases que representan el modelo, la vista y el controlador para una pequeña aplicación MVC que interactúa con una base de datos.
Este documento describe cómo conectarse a una base de datos desde C# y cómo implementar la arquitectura MVC. Explica cómo crear una conexión a la base de datos usando ADO.NET y cómo implementar el patrón MVC dividiendo la aplicación en las capas Modelo, Vista y Controlador. Además, proporciona instrucciones paso a paso para crear una pequeña aplicación que gestione estudiantes usando este patrón arquitectónico.
Esta es la presentación que he preparado para mis compañeros de @NITSNETS en la que explico la integración del testing a todos los niveles de un proyecto y profundizo un poco más en la aplicación práctica para un entorno basado en Laravel.
Este documento discute temas avanzados de GWT como pruebas de cliente, depuración, JSNI, enlace diferido, AJAX y RPC. Explica cómo ejecutar pruebas de cliente en diferentes modos como JUnit, Selenium y RemoteWeb. También cubre cómo depurar aplicaciones GWT de forma similar a otras aplicaciones Java y la recomendación de hacer TDD en lugar de depurar. Luego describe características clave de GWT como JSNI para usar JavaScript dentro de Java, enlace diferido para seleccionar implementaciones basadas en el navegador y AJ
El documento presenta información sobre interfaz gráfica de usuario en Java. Explica que la interfaz gráfica se construye incorporando componentes GUI como ventanas, botones y cajas de diálogo. Describe cómo crear una ventana básica usando la clase JFrame y manejar eventos. También cubre temas como tipos de componentes, jerarquía de clases, uso de hilos y valores para cerrar la aplicación.
Este documento describe un Trabajo Fin de Grado que desarrolla un servicio web para generar escenas 3D a partir de proveedores de datos OGC como WMS, WFS y WCS. El proyecto tiene como objetivos ampliar un prototipo anterior mediante la adaptación del servicio a REST, la generación asíncrona de escenas, la inclusión de entidades WFS y la generación de múltiples niveles de detalle. El proyecto también liberó el código como software libre bajo licencias GPL y AGPL.
Estrategias para desarrollo crossplatform en Windows Phone 8 y Windows 8Sorey García
Este documento describe las similitudes y diferencias entre el desarrollo de aplicaciones para Windows Phone 8 y Windows 8. Ambas plataformas comparten el mismo marco de trabajo XAML y .NET, pero cada una tiene sus propias API. El documento explica cómo compartir código entre plataformas mediante bibliotecas compartidas, archivos enlazados y componentes Windows Runtime. También cubre temas como el patrón MVVM y la gestión de las diferencias entre plataformas.
Este documento presenta información sobre sentencias de control en bases de datos y SQL. Explica que las sentencias de control permiten modificar el flujo de un programa mediante ciclos y condicionales. También cubre sentencias de control de transacciones como COMMIT, ROLLBACK, y LOCK TABLE. Por último, introduce conceptos como SQL hospedado, SQL/CLI y sublenguajes especializados.
Este documento describe la creación de una extensión para Sap2000 llamada DARC, desarrollada en Visual C# e integrada con la API de Sap2000. La extensión automatiza los procesos de modelado, análisis y diseño de tanques circulares de concreto armado en Sap2000. El usuario solo debe ingresar parámetros generales de la estructura, luego la extensión se encargará de modelarla, asignar cargas, materiales, condiciones de contorno y realizar los análisis, considerando factores como efectos hidrod
Este documento presenta un resumen básico del framework Struts. Explica que Struts implementa el patrón MVC en Java y cómo funciona en aplicaciones web mediante solicitudes del navegador al controlador. También describe cómo Struts simplifica el desarrollo MVC separando la lógica del negocio, la vista y el controlador. El documento luego resume los componentes clave de Struts como el modelo, la vista y el controlador.
Este documento explica cómo crear una aplicación básica en ASP.NET MVC 3 usando Razor para gestionar una lista de clientes. Describe la estructura del proyecto MVC, la creación de un modelo de datos, un controlador y vistas. Se genera una base de datos, listado y funcionalidad básica de crear/editar/eliminar clientes para explicar conceptos básicos de MVC.
El documento describe el patrón de diseño Abstract Factory. Abstract Factory proporciona una interfaz para crear familias de objetos relacionados sin especificar sus clases concretas. Se usa para crear familias de widgets que comparten características comunes pero tienen diferencias para diferentes sistemas operativos o interfaces gráficas. Abstract Factory aísla el código del cliente de las clases de implementación y permite cambiar fácilmente entre familias de productos.
Este documento presenta Spring Boot y Spring Cloud. Introduce Spring Boot como un framework que facilita el desarrollo de aplicaciones de forma rápida y fácil. Explica los conceptos básicos de Spring Boot como Starters, configuración externa y estructura de proyecto. También describe características como Actuator y JTwig. Finalmente, introduce conceptos de arquitectura de microservicios y cómo Spring Cloud ayuda con servicios de descubrimiento, balanceo de carga y circuit breaker.
Este documento presenta una formación sobre pruebas unitarias (test unitarios). Explica los tipos de pruebas, incluyendo pruebas funcionales, de integración, de rendimiento y pruebas unitarias. Detalla los beneficios de las pruebas unitarias y la estructura básica de una prueba unitaria (arreglar, actuar, afirmar). También cubre conceptos como dobles de prueba (mocks, stubs, spies), cómo escribir pruebas unitarias efectivas y herramientas para pruebas unitarias
Este documento presenta una guía práctica para el taller de creación de una máquina cliente utilizando sockets. El objetivo es utilizar sockets como un sistema de comunicación entre procesos de diferentes máquinas de una red. Se explica cómo crear una aplicación cliente en Java que se conecte a un servidor mediante un socket, lea información del servidor y la muestre. Adicionalmente, se detalla el funcionamiento de una conexión socket entre un cliente y servidor.
Picasso es una librería para cargar imágenes de forma eficiente en aplicaciones Android. Asynchronous HTTP Client permite realizar peticiones HTTP de forma asíncrona para obtener datos de APIs. Otto es un bus de eventos que permite desacoplar los componentes de una aplicación que se comunican mediante la publicación y suscripción de mensajes.
Netty is an asynchronous event-driven network application framework for rapid development of maintainable high performance protocol servers & clients. AND IT'S TRUE!
In this talk given at JBCNConf 2015 in Barcelona, we will see how we use Netty at Trovit since 2013, what brought to us and how it opened our minds. We will share tips that helped us to learn more about Netty, some performance tricks and all things that worked for us.
Google Guava - Core libraries for Java & AndroidJordi Gerona
Talk at GDG DevFest Barcelona 2013.
The Guava project contains several of Google's core libraries that we rely on in our Java-based projects: collections, caching, primitives support, concurrency libraries, common annotations, string processing, I/O, and so forth.
Msdn Webcast InyeccióN De Dependencias Con Spring FrameworkGabriel Oliva
Este documento presenta una introducción al patrón de inyección de dependencias (IoC) y cómo se implementa a través del framework Spring. Explica los problemas de dependencias entre clases, alternativas como interfaces y fábricas de objetos, e introduce Spring como un contenedor IoC que resuelve dependencias mediante configuración. Spring ofrece características adicionales como AOP y soporte para datos, web y escritorio.
GWT es un framework de desarrollo de Google que permite crear aplicaciones web complejas usando Java. Los proyectos GWT tienen una estructura de paquetes separando el código del cliente y servidor, e incluyen módulos, clases EntryPoint y llamadas RPC para comunicación con el servidor. GWT compila el código Java a JavaScript para ejecutarse en el navegador, permitiendo desarrollar interfaces gráficas ricas sin refrescos de página.
Este documento describe el patrón de diseño Facade. Facade proporciona una interfaz simplificada para un subsistema complejo. Se usa Facade para ocultar la complejidad de un subsistema y hacerlo más fácil de usar para los clientes. El patrón involucra una clase Facade que delega las solicitudes de los clientes a las clases apropiadas del subsistema subyacente.
El documento describe cómo conectarse a una base de datos desde C# y cómo implementar el patrón arquitectónico Modelo Vista Controlador (MVC). Explica los pasos para conectarse a una base de datos usando ADO.NET y luego crea clases que representan el modelo, la vista y el controlador para una pequeña aplicación MVC que interactúa con una base de datos.
Este documento describe cómo conectarse a una base de datos desde C# y cómo implementar la arquitectura MVC. Explica cómo crear una conexión a la base de datos usando ADO.NET y cómo implementar el patrón MVC dividiendo la aplicación en las capas Modelo, Vista y Controlador. Además, proporciona instrucciones paso a paso para crear una pequeña aplicación que gestione estudiantes usando este patrón arquitectónico.
Esta es la presentación que he preparado para mis compañeros de @NITSNETS en la que explico la integración del testing a todos los niveles de un proyecto y profundizo un poco más en la aplicación práctica para un entorno basado en Laravel.
Este documento discute temas avanzados de GWT como pruebas de cliente, depuración, JSNI, enlace diferido, AJAX y RPC. Explica cómo ejecutar pruebas de cliente en diferentes modos como JUnit, Selenium y RemoteWeb. También cubre cómo depurar aplicaciones GWT de forma similar a otras aplicaciones Java y la recomendación de hacer TDD en lugar de depurar. Luego describe características clave de GWT como JSNI para usar JavaScript dentro de Java, enlace diferido para seleccionar implementaciones basadas en el navegador y AJ
El documento presenta información sobre interfaz gráfica de usuario en Java. Explica que la interfaz gráfica se construye incorporando componentes GUI como ventanas, botones y cajas de diálogo. Describe cómo crear una ventana básica usando la clase JFrame y manejar eventos. También cubre temas como tipos de componentes, jerarquía de clases, uso de hilos y valores para cerrar la aplicación.
Este documento describe un Trabajo Fin de Grado que desarrolla un servicio web para generar escenas 3D a partir de proveedores de datos OGC como WMS, WFS y WCS. El proyecto tiene como objetivos ampliar un prototipo anterior mediante la adaptación del servicio a REST, la generación asíncrona de escenas, la inclusión de entidades WFS y la generación de múltiples niveles de detalle. El proyecto también liberó el código como software libre bajo licencias GPL y AGPL.
Estrategias para desarrollo crossplatform en Windows Phone 8 y Windows 8Sorey García
Este documento describe las similitudes y diferencias entre el desarrollo de aplicaciones para Windows Phone 8 y Windows 8. Ambas plataformas comparten el mismo marco de trabajo XAML y .NET, pero cada una tiene sus propias API. El documento explica cómo compartir código entre plataformas mediante bibliotecas compartidas, archivos enlazados y componentes Windows Runtime. También cubre temas como el patrón MVVM y la gestión de las diferencias entre plataformas.
Este documento presenta información sobre sentencias de control en bases de datos y SQL. Explica que las sentencias de control permiten modificar el flujo de un programa mediante ciclos y condicionales. También cubre sentencias de control de transacciones como COMMIT, ROLLBACK, y LOCK TABLE. Por último, introduce conceptos como SQL hospedado, SQL/CLI y sublenguajes especializados.
Este documento describe la creación de una extensión para Sap2000 llamada DARC, desarrollada en Visual C# e integrada con la API de Sap2000. La extensión automatiza los procesos de modelado, análisis y diseño de tanques circulares de concreto armado en Sap2000. El usuario solo debe ingresar parámetros generales de la estructura, luego la extensión se encargará de modelarla, asignar cargas, materiales, condiciones de contorno y realizar los análisis, considerando factores como efectos hidrod
Este documento presenta un resumen básico del framework Struts. Explica que Struts implementa el patrón MVC en Java y cómo funciona en aplicaciones web mediante solicitudes del navegador al controlador. También describe cómo Struts simplifica el desarrollo MVC separando la lógica del negocio, la vista y el controlador. El documento luego resume los componentes clave de Struts como el modelo, la vista y el controlador.
Este documento explica cómo crear una aplicación básica en ASP.NET MVC 3 usando Razor para gestionar una lista de clientes. Describe la estructura del proyecto MVC, la creación de un modelo de datos, un controlador y vistas. Se genera una base de datos, listado y funcionalidad básica de crear/editar/eliminar clientes para explicar conceptos básicos de MVC.
El documento describe el patrón de diseño Abstract Factory. Abstract Factory proporciona una interfaz para crear familias de objetos relacionados sin especificar sus clases concretas. Se usa para crear familias de widgets que comparten características comunes pero tienen diferencias para diferentes sistemas operativos o interfaces gráficas. Abstract Factory aísla el código del cliente de las clases de implementación y permite cambiar fácilmente entre familias de productos.
Este documento presenta Spring Boot y Spring Cloud. Introduce Spring Boot como un framework que facilita el desarrollo de aplicaciones de forma rápida y fácil. Explica los conceptos básicos de Spring Boot como Starters, configuración externa y estructura de proyecto. También describe características como Actuator y JTwig. Finalmente, introduce conceptos de arquitectura de microservicios y cómo Spring Cloud ayuda con servicios de descubrimiento, balanceo de carga y circuit breaker.
Este documento presenta una formación sobre pruebas unitarias (test unitarios). Explica los tipos de pruebas, incluyendo pruebas funcionales, de integración, de rendimiento y pruebas unitarias. Detalla los beneficios de las pruebas unitarias y la estructura básica de una prueba unitaria (arreglar, actuar, afirmar). También cubre conceptos como dobles de prueba (mocks, stubs, spies), cómo escribir pruebas unitarias efectivas y herramientas para pruebas unitarias
Este documento presenta una guía práctica para el taller de creación de una máquina cliente utilizando sockets. El objetivo es utilizar sockets como un sistema de comunicación entre procesos de diferentes máquinas de una red. Se explica cómo crear una aplicación cliente en Java que se conecte a un servidor mediante un socket, lea información del servidor y la muestre. Adicionalmente, se detalla el funcionamiento de una conexión socket entre un cliente y servidor.
Picasso es una librería para cargar imágenes de forma eficiente en aplicaciones Android. Asynchronous HTTP Client permite realizar peticiones HTTP de forma asíncrona para obtener datos de APIs. Otto es un bus de eventos que permite desacoplar los componentes de una aplicación que se comunican mediante la publicación y suscripción de mensajes.
Netty is an asynchronous event-driven network application framework for rapid development of maintainable high performance protocol servers & clients. AND IT'S TRUE!
In this talk given at JBCNConf 2015 in Barcelona, we will see how we use Netty at Trovit since 2013, what brought to us and how it opened our minds. We will share tips that helped us to learn more about Netty, some performance tricks and all things that worked for us.
Google Guava - Core libraries for Java & AndroidJordi Gerona
Talk at GDG DevFest Barcelona 2013.
The Guava project contains several of Google's core libraries that we rely on in our Java-based projects: collections, caching, primitives support, concurrency libraries, common annotations, string processing, I/O, and so forth.
Este documento proporciona una introducción a las pruebas unitarias. Explica la definición de pruebas unitarias, los marcos de prueba como JUnit, cómo escribir una primera prueba unitaria, diferentes tipos de pruebas, cómo usar Mockito para pruebas con dependencias, y cómo escribir código que sea fácil de probar mediante técnicas como inyección de dependencias. También discute excusas comunes para no escribir pruebas unitarias y cómo detectar código que no es fácil de probar.
Mitos y otras criaturas startuperas (webbar)Jordi Gerona
Este documento presenta algunos mitos y consejos sobre el lanzamiento de startups. Primero, destaca que las ideas por sí solas no son suficientes y que la ejecución es clave para el éxito. Luego advierte que en el entorno emprendedor se conocerá gente buena pero también algunos no tan buenos. Finalmente, enfatiza la importancia de creer en el equipo pero también de no olvidarse de uno mismo ni de la gente que lo rodea.
Este documento presenta una introducción a Mercurial (Hg), un sistema de control de versiones distribuido (DVCS). Explica conceptos básicos como trabajar localmente sin conexión, realizar commits, revertir cambios y ver el estado. También cubre tópicos como crear y clonar repositorios, hacer cambios y compartirlos mediante pull y push, y trabajar en equipo usando branches y merges. Por último, menciona recursos adicionales para aprender más sobre Hg.
El documento presenta una introducción a las pruebas unitarias. Explica que las pruebas unitarias automatizan la validación de unidades de código para verificar su funcionamiento. Luego describe algunos frameworks populares como JUnit, tipos comunes de pruebas, y patrones como el uso de dobles para aislar dependencias. Finalmente, identifica algunos desafíos comunes como el estado global, las APIs engañosas y el código no testable, y ofrece soluciones como inyección de dependencias.
6. 3 aproximaciones y media
The Factory Pattern (Patrón Fábrica)
+ Service Locator
Dependency Injection a mano
Dependency Injection con Guice
7. parte constante
public interface Dictionary {
void spellchecking(Text text);
}
public class CatalanDictionary
implements Dictionary {
@Override
public void spellchecking(Text text) {
// comprobación en catalán
}
}
Cualquier servicio se mantiene independientemente de la
aproximación
9. factory pattern / client
public class PhoneClient {
Dictionary dictionary;
public void sendSMS(Text text) {
dictionary = DictionaryFactory.getInstance();
dictionary.spellchecking(text);
}
}
10. factory pattern / service
public static class DictionaryFactory {
static class DictionaryHolder {
static Dictionary instance = new CatalanDictionary();
}
public static Dictionary getInstance() {
return DictionaryHolder.instance;
}
public static void setInstance(Dictionary mock) {
DictionaryHolder.instance = mock;
}
}
11. factory pattern / consideraciones
Hay que escribir una fábrica para cada objeto y para cada
dependencia - boilerplate code
Hay que escribir una fábrica para cada variación en las
dependencias.
El cliente establece sus dependencias en tiempo de
compilación - Están encapsuladas.
Propagación viral de clases estáticas - static
Difícil reutilizar el código cliente en otro contexto.
Hay que modificar el código para poder hacer unit testing.
13. service locator
Tipo especial de fábrica.
Hereda casi todos sus problemas.
Introduce nuevos problemas. eg: no type-safety
Dictionary dictionary = (Dictionary) new ServiceLocator()
.get("CatalanDictionary");
15. el principio de hollywood
public class PhoneClient {
private final Dictionary dictionary;
public PhoneClient(Dictionary dictionary) {
this.dictionary = dictionary
}
public void sendSMS(Text text) {
dictionary.spellchecking(text);
}
}
"Don't call us, we'll call you"
16. DI manual / ventajas
No podemos crear un cliente sin los servicios necesarios.
Dependencias claras.
Podemos reutilizar el cliente con múltiples implementaciones
de un mismo servicio.
Las dependencias pasan de estar en tiempo de compilación a
estar a nivel de de aplicación.
La clase es testeable.
Pero aun tenemos que escribir más codigo fábrica!
18. Google Guice
Framework de DI creado por Google (2007).
Toda aplicación Java lo utilitza: Google Docs, GMail,
Adwords...
objetivos
Evitar escribir fábricas y boilerplate code
Más comprobaciones de tipos - Type safety
Flexibilidad y facilidad para escribir buen código
19. @Inject
public class PhoneClient {
private final Dictionary dictionary;
@Inject
public PhoneClient(Dictionary dictionary) {
this.dictionary = dictionary
}
public void sendSMS(Text text) {
dictionary.spellchecking(text);
}
}
Aplicamos @Inject para obtener las dependencias.
20. @Injections
@Inject private Dictionary dictionary;
field injection
method injection
@Inject
public void setDictionary(Dictionary dictionary) {
this.dictionary = dictionary;
}
constructor injection
public class PhoneClient {
private final Dictionary dictionary;
@Inject
public PhoneClient(Dictionary dictionary) {
this.dictionary = dictionary
}
}
21. modules
public class DictionaryModule extends AbstractModule {
protected void configure() {
bind(Dictionary.class).to(CatalanDictionary.class);
}
}
Tenemos Modules que configuran Guice. no XML... yay!
public class DictionaryModule implements Module {
public void configure(Binder binder) {
binder.bind(Dictionary.class).to(CatalanDictionary.class);
}
}
versión DRY (Don't Repeat Yourself)
versión JIT (Just In Time)
@ImplementedBy(CatalanDictionary.class)
public class Dictionary {}
22. bootstrapping
Iniciando una aplicación
public class PhoneRunner {
public static void main(String[] args) {
Injector injector = Guice
.createInjector(new DictionaryModule());
PhoneClient phone = Injector
.getInstance(PhoneClient.class);
phone.sendSMS(new Text("foo text"));
}
}
consideraciones
@Inject es viral.
Solo una clase debería tratar con el Injector.
24. múltiples implementaciones
public class DictionaryModule extends AbstractModule {
protected void configure() {
bind(Dictionary.class)
.annotatedWith(Catalan.class)
.to(CatalanDictionary.class);
}
}
Binding annotations
public class PhoneClient {
private final Dictionary dictionary;
@Inject
public PhoneClient(@Catalan Dictionary dictionary) {
this.dictionary = dictionary
}
}
Hay que configurarlo en un Module
32. unit testing
Aplicando DI con Guice, nuestro código ya es testeable!
Código (método) que ejecuta un otro código para comprobar su
validez.
funcionamiento
Precondición - Clase a testear - Postcondición (asserts)
características
Rápido, repetible, automático.
frameworks
Junit, TestNG, Mockito, EasyMock, JMock
33. test con junit
public class StringsTest {
@Test
public void stripAllHTMLForAGivenText() {
String html = "<a>Link</a>";
String expected = "Link";
assertEquals(expected,Strings.stripHTML(html));
}
}
public class Strings {
public static String stripHTML(String input) {
return input.replaceAll("</?+(b)[ˆ<>]++>", "");
}
}
unit test
34. test con dependencias
// Class under test
CreditCardProcessor creditCardProcessor;
@Test
public void chargeCreditCard() {
creditCardProcessor = Guice.createInjector()
.getInstance(CreditCardProcessor.class);
CreditCard c = new CreditCard("9999 0000 7777", 5, 2009);
creditCardProcessor.charge(c, 30.0);
assertThat(creditCardProcessor.balance(c), is(-30.0));
}
es incorrecto!
@Inject
public CreditCardProcessor(Queue queue) {
this.queue = queue;
}
unit test…?
35. test con dependencias / mocks
@Test
public void chargeCreditCard() {
Queue queue = mock(Queue.class);
CreditCard c = new CreditCard("9999 0000 7777", 5, 2009);
creditCardProcessor = new CreditCardProcessor(queue);
creditCardProcessor.charge(c, 30.0);
verify(queue).enqueue(c, 30.0);
}
Dependencias falsas: mocks (mockito)
36. para acabar…
futuro de dependency injection
Google + SpringSource = JSR-330 acabada
Spring 3 - annotation based
Maven 3 - de plexus a guice
guice 3.0
Soporte para JSR-330
guice-persist integrado (antiguo warp-persist)
Más SPI y Extension Points
y más guice!
GIN - GWT INjection, subset de Guice
RoboGuice - Guice en Android. Inject de views, resources...
Introduir eventuo, els seus inicis, alguna caracterísitca? escollir tecnologies, descobrir Guice i com va canviar el meu punt de vista
Introduir eventuo, els seus inicis, alguna caracterísitca? escollir tecnologies, descobrir Guice i com va canviar el meu punt de vista
diseny habitual, parlar sobre interficies per separar codi, modularitat, mantenibilitat.
parlar de serveis i clients. posar exemple del coche o del telefon.
Destacar el més important, que és delegar la creació dels objectes a la fàbrica.
static = no interface, no polimòrfic, estat global, trenca la modularitat, dificil heredar per la constructora
Parlar del patró, destacar-ho com a tal
comprovació de tipus = generics. exemple llistes.
field / constructor / method injection yup!
field / constructor / method injection yup!
comentari Spring xml - annotations.
parlar també del binder, que és l&apos;encarregat de configurar l&apos;injector o guice.
inject viral, comentar errors d&apos;inici
crear annotations és fàcil.
Un Provider es una fabrica que devuelve instancias de un tipo.
posar exemple d&apos;hibernate i les sessions
Un Provider es una fabrica que devuelve instancias de un tipo.
parlar d&apos;un test com pensar el que volem o esperem que passi.
parlar d&apos;un test com pensar el que volem o esperem que passi.
parlar d&apos;un test com pensar el que volem o esperem que passi.