2012-09-30 9 views
13

Jestem zdezorientowany między ref a atrybut depend-on na wiosnę. Czytam dokument źródłowy, ale nadal jestem zdezorientowany. Chciałbym znać dokładną różnicę między tymi dwoma i w którym przypadku jeden zostanie użyty.ref vs atrybuty zależne-na wiosnę

Odpowiedz

19

Według spring documentation

Jeśli chcesz wyrazić zależność od wielu ziaren, możesz podać listę nazwisk fasoli jako wartość z „zależy na” atrybutu, z przecinkami, spacjami i średnikami wszystkich ważne ograniczniki, tak:

<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" /> 

do „zależy na” atrybutu i właściwość jest używana nie tylko określić zależność czasową inicjalizacji, ale także określić odpowiedni zniszczyć zależność czasową (w przypadku pojedynczych ziaren wyłącznie). Ziarna zależne zdefiniowane w atrybucie "zależy od" zostaną najpierw zniszczone przed zniszczeniem samej fasoli. Dzięki temu można również kontrolować kolejność wyłączania.

Z drugiej strony, w większości przypadków fakt, że ziarno jest zależne od innego, wyraża się w fakcie, że jedna fasola jest ustawiona jako własność innej. Zwykle jest to realizowane za pomocą elementu w metadanych konfiguracyjnych opartych na języku XML.

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

To jest dobre wyjaśnienie :) – Krishna

+0

@Anshu co, jeśli nie wiem, id Bean, ale imię i nazwisko? – verystrongjoe

+0

Jest to bardzo pomocne przy przygotowywaniu komponentu A oczekującego na konstrukcję B fasoli, nawet jeśli B nie jest właściwością A. Uderzyłem w tę sprawę podczas testowania, gdzie potrzebowałem proxy sieciowej do zainicjowania przed klientem, mimo że klient nie wiedział nic o proxy. – Wheezil

10

Również http://docs.spring.io/spring/docs/3.2.x/javadoc-api/org/springframework/context/annotation/DependsOn.html

Zależy-on -> Fasola na której obecny fasola zależy. Wszystkie określone ziarna są gwarantowane przez kontener przed tym komponentem bean. Używany rzadko w przypadkach, w których komponent bean nie jest jednoznacznie zależny od innego przez właściwości lub argumenty konstruktora, ale zależy raczej od skutków ubocznych inicjalizacji innego komponentu bean.

W powyższej odpowiedzi dostarczonych poniżej stwierdzenie jest błędne,

„fasola zależne, które są zdefiniowane w«zależy na»atrybut zostanie zniszczona najpierw przed danym fasoli sama jest zniszczona”

Główny komponent zostanie najpierw zniszczony, a następnie zależne ziarna zostaną zniszczone.

Oto mój wynik testu,

zniszczyć głównego klasy nazywa.

Destroy of dependent jest wywoływana.

3

Pomóc może przykład sytuacji, w której potrzebna jest zależność. Używam Springa do ładowania i drobienia moich ziaren. Oto definicja przykład fasola:

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

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

Zauważ, że wartość nieruchomości jest ciągiem znaków, który odwołuje otherBeanId. Ze względu na sposób, w jaki ta zmienna jest rozwiązywana, Spring nie dowiaduje się o zależności, więc może ona zniszczyć inny obiekt: , a następnie: myBean myBean. To może pozostać przez pewien czas w stanie uszkodzonym.

mogę użyć zależy aby rozwiązać ten problem w następujący sposób:

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