1

Spring @Autowired

La funcionalidad es resolver mediante inyección las dependencias de un bean de Spring.

@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

@ControllerpublicclassMyController{
 
    privatefinal MyBean myBean;
 
    @AutowiredpublicMyController(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.

@ControllerpublicclassMyController{
 
    private MyBean myBean;
 
    @AutowiredpublicvoidsetMyBean(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.

@ControllerpublicclassMyController {@Autowiredprivate 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.

Escribe tu comentario
+ 2