Spring @Autowired

By | 5 septiembre 2014

Aunque en Spring existen una amplia cantidad de anotaciones, una de las mas importantes es @Autowired.

La funcionalidad tan importante como básica de esta anotación es resolver mediante inyección las dependencias de un bean de Spring. Por eso es fundamental conocer bien las características de @Autowired.

Lo primero, @Autowired permite resolver la inyección de dependencias de los siguiente modos.

  • En el constructor de la clase.
  • En un atributo.
  • En un método setter.
  • En un método JavaConfig.

Puesto que el cuarto caso es para la creación de nuevas dependencias, y su funcionamiento esta claro, vamos a entrar a analizar con mas detalle las diferencias que existen entre los tres primeros.

La mas clara, es que al realizar @Autowired en el constructor, la inyección se realiza en el momento en que el objeto es creado, lo que nos permite marcar con un final real nuestro recurso inyectado (matizo el real por algo que veremos mas adelante).

@Controller
public class MyController {

    private final MyBean myBean;

    @Autowired
    public MyController(MyBean myBean) {
      
        this.myBean = myBean;
    }
}

Si utilizamos @Autowired en un metodo setter, se creara el metodo y una vez creado, Spring inyectara el bean mediante de dicho metodo.

@Controller
public class MyController {

    private MyBean myBean;

    @Autowired
    public void setMyBean(MyBean myBean) {

        this.myBean = myBean;
    }
}

Y por ultimo tenemos el caso de @Autowired sobre el atributo, Spring crea la instancia del objeto y una vez creada le inyecta la independencia.

@Controller
public class MyController {
 
    @Autowired
    private MyBean myBean;
}

Lo realmente sorprendente, es que desde la versión 3.0 de Spring, se puede utilizar @Autowired en un atributo marcado como final. Desconozco que acción desempeña Spring para poder realizar esta operación, me imagino que utilizara alguna estrategia mediante la Java Reflection, pero puede presentar problemas en algún contexto de aplicación, como por ejemplo en cuestiones de concurrencia.

Así que si verdaderamente queréis implementar un atributo final hacedlo realizando la inyección con @Autowired desde el constructor.

Comparte esta entrada enShare on LinkedIn0Tweet about this on Twitter0Share on Facebook0Share on Google+0

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos necesarios están marcados *