Muestra las diferencias entre dos versiones de la página.
unidades:10_servidor:04_inyecciondependencias [2014/08/31 00:10] admin |
unidades:10_servidor:04_inyecciondependencias [2014/09/03 11:56] (actual) admin [La solución] |
||
---|---|---|---|
Línea 2: | Línea 2: | ||
La inyección de dependencias (en inglés Dependency Injection, DI) es un patrón de diseño sencillo de usar aunque quizás resulte algo muy novedoso para algunas personas. | La inyección de dependencias (en inglés Dependency Injection, DI) es un patrón de diseño sencillo de usar aunque quizás resulte algo muy novedoso para algunas personas. | ||
- | La DI intenta resolver el problema que hay en el código del ejemplo de JSON de hace 2 temas: | + | |
+ | ===== El problema ===== | ||
+ | La inyección de dependencias intenta resolver el problema que hay en el código del ejemplo de JSON de hace 2 temas: | ||
<sxh java;highlight: [5]> | <sxh java;highlight: [5]> | ||
Línea 33: | Línea 35: | ||
El problema es que tenemos dentro del código la implementación que usamos del interfaz y si usamos el interfaz para no saber nada sobre su implementación es un sin sentido que tengamos en el propio código una referencia a la implementación. Además is quisiéramos cambiar la implementación deberíamos ir por todo el código buscando donde se usa para cambiarlo. | El problema es que tenemos dentro del código la implementación que usamos del interfaz y si usamos el interfaz para no saber nada sobre su implementación es un sin sentido que tengamos en el propio código una referencia a la implementación. Además is quisiéramos cambiar la implementación deberíamos ir por todo el código buscando donde se usa para cambiarlo. | ||
- | La solución a todo ésto es la **Inyección de Dependencias** que evita que nuestro código tenga referencia a las implementaciones que usamos. | + | ===== La solución ===== |
+ | La solución a todo ésto es la **Inyección de Dependencias** que evita que nuestro código tenga referencias a las implementaciones que usamos. | ||
- | Vamos a modificar el controlador del tema anterior de forma que usemos ''JsonTransformer'': | + | Vamos a modificar el controlador ''UsuarioController '' del tema anterior de forma que usemos ''JsonTransformer'': |
- | <sxh java;highlight: [6]> | + | <sxh java;highlight: [6];title:UsuarioController.java> |
@Controller | @Controller | ||
public class UsuarioController { | public class UsuarioController { | ||
Línea 52: | Línea 55: | ||
} | } | ||
</sxh> | </sxh> | ||
- | Vemoa que ahora el controlador en vez de mostrar en la página web el texto "Hola mundo" retornara el JSON: | + | Vemos que ahora el controlador en vez de mostrar en la página web el texto "Hola mundo" retornara el JSON: |
{"nombre":"Alberto Tortosa","email":"alberto_tortosa@gmail.com","edad":91} | {"nombre":"Alberto Tortosa","email":"alberto_tortosa@gmail.com","edad":91} | ||
Línea 77: | Línea 80: | ||
</beans> | </beans> | ||
</sxh> | </sxh> | ||
- | Línea 12: Hemos añadido la clase ''es.cursoangularjs.inyecciondependencias.json.JsonTransformerImplJackson'' diciendo que ahora puede ser inyectada si solicitan una implementación del interfaz ''JsonTransformer'' | + | * Línea 12: Hemos añadido la clase ''es.cursoangularjs.inyecciondependencias.json.JsonTransformerImplJackson'' diciendo que ahora puede ser inyectada si solicitan una implementación del interfaz ''JsonTransformer'' |
| | ||
¿Como sabe Spring que esa clase se debe inyectar si solicitan el interfaz ''JsonTransformer''? Muy sencillo porque mira la clase y ve que implementa ese interfaz. | ¿Como sabe Spring que esa clase se debe inyectar si solicitan el interfaz ''JsonTransformer''? Muy sencillo porque mira la clase y ve que implementa ese interfaz. | ||
Línea 99: | Línea 102: | ||
} | } | ||
</sxh> | </sxh> | ||
- | | + | * Línea 5: Esta línea le dice a Spring que debe buscar una implementación del interfaz que hay a continuación y asignarle una instancia a la propiedad. |
+ | * Línea 6: Declaramos ahora la propiedad privada ''jsonTransformer'' pero no indicamos el objeto que lo implementa. Eso lo inyectará automáticamente Spring | ||
+ | |||
+ | Es decir que ahora la configuración sobre de implementaciones debemos usar está centralizada en el fichero ''applicationContext.xml'' y el resto de la aplicación gracias a la anotación ''@Autowired'' permite que se le inyecte la implementación que está definida en el fichero. Es decir que inyectar significa simplemente asignar un objeto a una propiedad pero sin que la clase a la que se le inyecta el objeto sepa de que clase es. | ||
+ | |||
+ | <note important> | ||
+ | Una cosa importante a tener en cuenta es que spring solo va a crear un única instancia de objeto a inyectar en toda la aplicación por lo que hay que tener cuidado con mantener un estado en el objeto o controlar el acceso de varias threads a la vez. | ||
+ | </note> | ||
+ | ===== Ejemplo ===== | ||
+ | El ejemplo de esta unidad es exactamente lo que acabamos de contar pero es un nuevo proyecto llamado "inyecciondependencias". | ||
+ | Lo único que debes recordar es que se han añadido también las librerías de Jackson y Spring. | ||
+ | |||
+ | <note> | ||
+ | Este ejemplo se encuentra en git en [[https://github.com/logongas/cursoangularjs/tree/master/inyecciondependencias]] | ||
+ | </note> | ||
+ |