2011-02-14 36 views
11

Tal vez, debido a mi inglés incorrecto, no pude entender el beneficio de usar la anotación @Autowired.beneficio de la anotación @Autowired en Java

De acuerdo con el tutorial, podemos simplificar el primer (I) caso a segundo caso (II.) Mediante @Autowired.

Mi pregunta es, ¿cuál es el significado de @Autowired? Porque ya no cuenta, ya que sin usar @Autowired, el compilador puede darse cuenta de que "EmpDao emDao" y "EmpManager" están estrechamente relacionados de acuerdo con la declaración.

código citado de here

I.

<bean id="empDao" class="EmpDao" /> 
    <bean id="empManager" class="EmpManager"> 
     <property name="empDao" ref="empDao" /> 
    </bean> 

public class EmpManager { 

    private EmpDao empDao; 

    public EmpDao getEmpDao() { 
     return empDao; 
    } 

    public void setEmpDao(EmpDao empDao) { 
     this.empDao = empDao; 
    } 

    ... 
} 

II.

<context:annotation-config /> 

<bean id="empManager" class="autowiredexample.EmpManager" /> 
<bean id="empDao"  class="autowiredexample.EmpDao" /> 

import org.springframework.beans.factory.annotation.Autowired; 

public class EmpManager { 

    @Autowired 
    private EmpDao empDao; 

} 
+2

No creo que pueda explicarlo más claramente de lo que su ejemplo ya lo hace. El segundo caso es más corto y tiene menos desorden de códigos. ¿Por qué no es algo bueno dentro y fuera de sí mismo? – skaffman

+0

Veo que podemos guardar algo de línea, pero no entiendo el beneficio real de @Autowired. si Spring hace instancia de EmpManager de lo que hará un EmpDao EmpDao también en el mismo tiempo. Con o sin @Autowired, también tenemos empDao – cscsaba

+0

Posible duplicado de [Understanding Spring @Autowired usage] (https://stackoverflow.com/questions/19414734/understanding-spring-autowired-usage) – tkruse

Respuesta

11

@Autowired es específico de la primavera. @Inject es el estándar equivallent. Es una anotación que le dice al contexto (primavera, o en el caso de @Inject - cualquier marco DI) que intente establecer un objeto en ese campo.

El compilador no tiene nada que ver con esto - es el marco DI (primavera) que crea instancias de los objetos en tiempo de ejecución, y luego selecciona sus dependencias en los puntos que se han especificado - ya sea a través de XML o mediante una anotación.

Acepto que es posible que un marco DI intente inyectar dependencias en todos los campos, incluso si no están anotados. (Y si quiere excluir un campo en particular, anotarlo). Pero eligieron la otra estrategia (configuración por convención). Por cierto:

  • si se utiliza configuración XML y elegir algún tipo de autowiring, las dependencias del frijol se autowired automáticamente sin la necesidad de especificar nada
  • puede especificar parámetros de cada contexto Autowiring.
+0

Lo tengo, así que el Spring No sé nada acerca de la declaración (características similares al compilador), es por eso que tenemos que guiar a Spring en cómo se relacionan las clases. Correcto ? – cscsaba

+0

@ user303352 spring sabe todo acerca de las clases, pero no sabe si lo desea inyectar algo allí o no. – Bozho

+0

Pero si Spring hace una instancia de EmpManager, también hará un EmpDao EmpDao al mismo tiempo. Con o sin @Autowired también tenemos empDao – cscsaba

0

@Autowired le dice a Spring que encuentre un bean del tipo declarado y cablee en ese bean, en lugar de requerir una búsqueda explícita por nombre de bean. Bajo ciertas circunstancias, puede simplificar las aplicaciones de configuración si solo tiene una implementación de sus tipos en un contexto Spring dado.

+0

Vi las diferencias, pero todo se puede deducir de la declaración sin utilizar @Autowired. ver el comentario de Bozho que señala mi incredulidad. La declaración es interpretada por el compilador, la anotación informa al Spring sobre la relación. – cscsaba

+0

bien, lo siento por perder el tiempo chicos, gracias por su ayuda y esfuerzo lo dejan en claro. – cscsaba

1

Cuando el servidor se inicia automáticamente. Se encuentra

<context:annotation-config /> 

en el contexto de la aplicación y luego pasa a través de las clases definidas en los contextos. Si hay algunos beans que están autoconectados, lo inyecta en la clase al referir el archivo de contexto.

Básicamente, promueve la convención sobre la configuración. Eso es lo que hace la mayoría de los marcos en estos días para reducir el tiempo de desarrollo.

+0

Tengo la misma respuesta que para Bozho: si Spring hace una instancia de EmpManager, también hará un EmpDao EmpDao al mismo tiempo. Con o sin @Autowired también tenemos empDao – cscsaba

+0

Crea una instancia de todas las clases en el archivo de contexto y debido al , pasa por todas las clases instanciadas para inyectar las dependencias. Entonces es como crear primero, escanear y luego inyectar. –

+0

Quizás no sé cuál es la inyección en real porque, en cuanto a mí, cuando Spring pasa y crea, por ejemplo, EmpManager de lo que hace y también empDao. EmpDao creado automáticamente durante la creación de EmpManager. – cscsaba

1

la anotación @Autowired Spring le dice a Spring que le den un frijol llamado 'empDao' y lo inyecta en la clase EmpManager, sin tener que agregar el empDao bean como propiedad en su archivo de configuración de primavera.

+0

Tengo la misma respuesta que para Bozho: pero si Spring hace una instancia de EmpManager, también hará un EmpDao EmpDao al mismo tiempo. Con o sin @Autowired también tenemos empDao – cscsaba

+0

bien, lo siento por perder el tiempo chicos, gracias por su ayuda y esfuerzo por dejarlo en claro. – cscsaba

Cuestiones relacionadas