2012-09-30 15 views
13

Estoy confundido entre el atributo ref y depends-on en Spring.I leí el doc de primavera pero todavía estoy confundido.Me gustaría saber la diferencia exacta entre los dos y en cuyo caso cuál uno debe ser usado.ref vs depende de los atributos en Spring

Respuesta

19

De acuerdo con la spring documentation

Si usted necesita expresar una dependencia de múltiples granos, puede proporcionar una lista de nombres de frijol como el valor de la 'depende-on' atributo, por comas, espacios en blanco y puntos y comas todo delimitadores válidos, así:

<bean id="beanOne" class="ExampleBean" depends-on="manager,accountDao"> 
    <property name="manager" ref="manager" /> 
</bean> 

<bean id="manager" class="ManagerBean" /> 
<bean id="accountDao" class="x.y.jdbc.JdbcAccountDao" /> 

el 'depende-on' de atributos y propiedades se utiliza no sólo para especificar una dependencia del tiempo de inicialización, sino también para especificar la dependencia del tiempo que corresponde a destruir (en el caso de los granos simples solamente) Los beans dependientes que se definen en el atributo 'depende de' se destruirán primero antes de que se destruya el propio bean correspondiente. Esto le permite controlar la orden de apagado también.

Por otro lado, para la mayoría de las situaciones, el hecho de que un bean sea una dependencia de otro se expresa por el hecho de que un bean se establece como una propiedad de otro. Esto normalmente se logra con el elemento en los metadatos de configuración basados ​​en XML.

<bean id="a" class="ClassA"/> 
<bean id="b" class="ClassB"> 
<property name="aref" ref="a" /> 
</bean> 
+0

Esta es una buena explicación :) – Krishna

+0

@Anshu lo que si no conoce el ID de frijol, pero el nombre completo? – verystrongjoe

+0

Esto es muy útil para hacer beans. Esperar a la construcción de beans B incluso si B no es propiedad de A. Llegué a este caso en las pruebas donde necesitaba un proxy de red para inicializarlo antes que un cliente, aunque el cliente no sabía nada sobre proxies. – Wheezil

10

Además, http://docs.spring.io/spring/docs/3.2.x/javadoc-api/org/springframework/context/annotation/DependsOn.html

Depende-en -> Frijoles de los que depende la judía actual. Todos los beans especificados están garantizados para ser creados por el contenedor antes de este bean. Se usa con poca frecuencia en los casos en que un bean no depende explícitamente de otras propiedades intermedias o argumentos de constructor, sino que depende de los efectos secundarios de la inicialización de otro bean.

En la respuesta anterior proporcionó, la siguiente declaración es incorrecta,

"frijoles dependientes que se definen en el 'depende-on' atributo se destruyó el primero antes del frijol relevante en sí sean destruidos"

Primero se destruirá el grano principal y luego se destruirán los granos dependientes.

aquí está mi resultado de la prueba,

destruir de clase principal se llama.

Destrucción de dependiente se llama.

3

Quizás sea útil un ejemplo de una situación en la que se necesita depender. Uso Spring para cargar y cablear mis granos. He aquí un ejemplo de definición de frijol:

<bean id="myBean" class="my.package.Class"> 
    <property name="destination" value="bean:otherBeanId?method=doSomething"/> 
</bean> 

<bean id="otherBeanId" class="my.package.OtherClass"/> 

en cuenta que el valor de la propiedad es una cadena, que hace referencia a otherBeanId. Debido a la forma en que se resuelve esta variable, Spring no se entera de la dependencia, por lo que puede destruir otherBeanId y luego myBean. Esto puede dejar myBean en un estado roto por un tiempo.

puedo usar depende de solucionar este problema de la siguiente manera:

<bean id="myBean" class="my.package.Class" depends-on="otherBeanId"> 
    <property name="destination" value="bean:otherBeanId?method=doSomething"/> 
</bean>