¡Esta es una revisión vieja del documento!


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.

La DI intenta resolver el problema que hay en el código del ejemplo de JSON de hace 2 temas:

public class Main {
 
 
    public static void main(String[] args) {
        JsonTransformer jsonTransformer=new JsonTransformerImplJackson();
         
        Usuario usuario=new Usuario("Alberto Tortosa","alberto_tortosa@gmail.com",91);
         
        String jsonUsuario=jsonTransformer.toJson(usuario);
         
        System.out.println(jsonUsuario);
         
         
        Usuario newUsuario=(Usuario) jsonTransformer.fromJson(jsonUsuario, Usuario.class);
           
        System.out.println("Nombre:"+newUsuario.getNombre());
        System.out.println("E-Mail:"+newUsuario.getEmail());
        System.out.println("Edad:"+newUsuario.getEdad());
         
    }
     
}

¿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 “Jackson” en la clase JsonTransformerImplJackson.

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.

Vamos a modificar el controlador del tema anterior de forma que usemos JsonTransformer:

@Controller
public class UsuarioController {

    @RequestMapping(value = {"/Usuario"})
    public void prueba(HttpServletRequest httpRequest, HttpServletResponse httpServletResponse) throws IOException {
        JsonTransformer jsonTransformer=new JsonTransformerImplJackson();
        
        Usuario usuario=new Usuario("Alberto Tortosa","alberto_tortosa@gmail.com",91);
        String jsonUsuario=jsonTransformer.toJson(usuario);
        
        httpServletResponse.getWriter().println(jsonUsuario);
    }
}
Vemoa 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}

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 JsonTransformer
  • 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 applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="
       http://www.springframework.org/schema/beans   http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
       http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd
">
 
    <context:annotation-config/>
 
    <bean class="es.cursoangularjs.inyecciondependencias.json.JsonTransformerImplJackson" />
    
</beans>

  • 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.

Ahora debemos modificar el controlador para que le inyecten la clase definida en el fichero applicationContext.xml.

@Controller
public class UsuarioController {
    
    @Autowired
    private JsonTransformer jsonTransformer;
    
    @RequestMapping(value = {"/Usuario"})
    public void prueba(HttpServletRequest httpRequest, HttpServletResponse httpServletResponse) throws IOException {
        Usuario usuario=new Usuario("Alberto Tortosa","alberto_tortosa@gmail.com",91);
        String jsonUsuario=jsonTransformer.toJson(usuario);
        
        httpServletResponse.getWriter().println(jsonUsuario);
    }
}

unidades/10_servidor/04_inyecciondependencias.1409436669.txt.gz · Última modificación: 2014/08/31 00:11 por admin
Ir hasta arriba
CC Attribution-Share Alike 3.0 Unported
chimeric.de = chi`s home Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0