unidades:10_servidor:04_inyecciondependencias
Diferencias
Muestra las diferencias entre dos versiones de la página.
| Próxima revisión | Revisión previa | ||
| unidades:10_servidor:04_inyecciondependencias [2014/08/30 23:18] – creado admin | unidades:10_servidor:04_inyecciondependencias [2014/09/03 11:56] (actual) – [La solución] admin | ||
|---|---|---|---|
| Línea 1: | Línea 1: | ||
| ====== 10.4 Inyección de dependencias ====== | ====== 10.4 Inyección de dependencias ====== | ||
| + | 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. | ||
| + | |||
| + | |||
| + | ===== 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; | ||
| + | public class Main { | ||
| + | |||
| + | |||
| + | public static void main(String[] args) { | ||
| + | JsonTransformer jsonTransformer=new JsonTransformerImplJackson(); | ||
| + | |||
| + | Usuario usuario=new Usuario(" | ||
| + | |||
| + | String jsonUsuario=jsonTransformer.toJson(usuario); | ||
| + | |||
| + | System.out.println(jsonUsuario); | ||
| + | |||
| + | |||
| + | Usuario newUsuario=(Usuario) jsonTransformer.fromJson(jsonUsuario, | ||
| + | |||
| + | System.out.println(" | ||
| + | System.out.println(" | ||
| + | System.out.println(" | ||
| + | |||
| + | } | ||
| + | |||
| + | } | ||
| + | </ | ||
| + | |||
| + | ¿Cual es el problema que hay en ese código? ¡Si lo hicimos muy bien añadiendo el interfaz para abstraernos de saber nada de Jackson! Pero , ¿Seguro que no sabemos nada de Jackson? Si te fijas en la línea 5 verás que aparece la palabra " | ||
| + | |||
| + | 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 ===== | ||
| + | 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 '' | ||
| + | |||
| + | <sxh java; | ||
| + | @Controller | ||
| + | public class UsuarioController { | ||
| + | |||
| + | @RequestMapping(value = {"/ | ||
| + | public void prueba(HttpServletRequest httpRequest, | ||
| + | JsonTransformer jsonTransformer=new JsonTransformerImplJackson(); | ||
| + | | ||
| + | Usuario usuario=new Usuario(" | ||
| + | String jsonUsuario=jsonTransformer.toJson(usuario); | ||
| + | | ||
| + | httpServletResponse.getWriter().println(jsonUsuario); | ||
| + | } | ||
| + | } | ||
| + | </ | ||
| + | Vemos que ahora el controlador en vez de mostrar en la página web el texto "Hola mundo" retornara el JSON: | ||
| + | {" | ||
| + | |||
| + | Pero seguimos teniendo el mismo problema que antes. ¿Como lo resolvemos? Como ya tenemos configurado Spring en esta aplicación , nos va a resultar muy sencillo. Simplemente vamos a hacer unas pequeñas modificaciones: | ||
| + | * Decirle a Spring cual es la clase con la implementación de '' | ||
| + | * Quitar la referencia a la implementación del controlador | ||
| + | * Indicar a Spring que inyecte la implementación en el controlador. | ||
| + | |||
| + | Vamos a modificar el fichero '' | ||
| + | <sxh xml; | ||
| + | <?xml version=" | ||
| + | <beans xmlns=" | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | "> | ||
| + | |||
| + | < | ||
| + | |||
| + | <bean class=" | ||
| + | | ||
| + | </ | ||
| + | </ | ||
| + | * Línea 12: Hemos añadido la clase '' | ||
| + | | ||
| + | ¿Como sabe Spring que esa clase se debe inyectar si solicitan el interfaz '' | ||
| + | |||
| + | Ahora debemos modificar el controlador para que le inyecten la clase definida en el fichero '' | ||
| + | |||
| + | <sxh java; | ||
| + | @Controller | ||
| + | public class UsuarioController { | ||
| + | | ||
| + | @Autowired | ||
| + | private JsonTransformer jsonTransformer; | ||
| + | | ||
| + | @RequestMapping(value = {"/ | ||
| + | public void prueba(HttpServletRequest httpRequest, | ||
| + | Usuario usuario=new Usuario(" | ||
| + | String jsonUsuario=jsonTransformer.toJson(usuario); | ||
| + | | ||
| + | httpServletResponse.getWriter().println(jsonUsuario); | ||
| + | } | ||
| + | } | ||
| + | </ | ||
| + | * 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 '' | ||
| + | |||
| + | Es decir que ahora la configuración sobre de implementaciones debemos usar está centralizada en el fichero '' | ||
| + | |||
| + | <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. | ||
| + | </ | ||
| + | ===== Ejemplo ===== | ||
| + | El ejemplo de esta unidad es exactamente lo que acabamos de contar pero es un nuevo proyecto llamado " | ||
| + | Lo único que debes recordar es que se han añadido también las librerías de Jackson y Spring. | ||
| + | |||
| + | < | ||
| + | Este ejemplo se encuentra en git en [[https:// | ||
| + | </ | ||
| + | |||
unidades/10_servidor/04_inyecciondependencias.1409433503.txt.gz · Última modificación: por admin
