Подтвердить что ты не робот

Ref vs зависит от атрибутов в Spring

Я запутался между атрибутом ref и зависимым от Spring. Я читаю документ spring, но я все еще запутался. Я хочу знать точную разницу между ними и в каком случае, какой из них будет использоваться.

4b9b3361

Ответ 1

Согласно spring документации

Если вам нужно выразить зависимость от нескольких beans, вы можете предоставить список имен bean в качестве значения атрибута "зависит от" , с запятыми, пробелами и точками с запятой все допустимые разделители, например

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

Атрибут и свойство "зависит от" используется не только для определения зависимости времени инициализации, но также для указания соответствующей зависимости времени от времени уничтожения (только для singleton beans). Зависимые beans, которые определены в атрибуте "зависит от" , будут уничтожены сначала до того, как будет уничтожен соответствующий bean. Таким образом, вы также можете контролировать порядок выключения.

С другой стороны, для большинства ситуаций факт, что a bean является зависимостью другого, выражается тем фактом, что один bean задается как свойство другого. Обычно это выполняется с помощью элемента в метаданных конфигурации на основе XML.

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

Ответ 2

Кроме того, http://docs.spring.io/spring/docs/3.2.x/javadoc-api/org/springframework/context/annotation/DependsOn.html

Зависит от →   Beans, от которого зависит текущий bean.   Любой Beans, указанный, должен быть создан контейнером до этого bean.   Используется нечасто в тех случаях, когда bean явно не зависит от другого через свойства или аргументы конструктора, а зависит от побочных эффектов другой инициализации bean.

В приведенном выше ответе приведенное ниже утверждение неверно,

"Зависимый Beans, который определен в атрибуте" зависит от ", будет уничтожен первым до того, как будет уничтожен соответствующий bean"

Основной bean будет уничтожен первым, а затем будет уничтожен зависимый Beans.

Вот мой результат теста,

уничтожается главный класс.

Вызывается уничтожение зависимого.

Ответ 3

Возможно, пример ситуации, в которой зависит от необходимости, поможет. Я использую Spring для загрузки и подключения моего beans. Ниже приведен пример определения bean:

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

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

Обратите внимание, что значение свойства представляет собой строку, которая ссылается на otherBeanId. Из-за того, как эта переменная разрешена, Spring не узнает об этой зависимости, поэтому она может уничтожить otherBeanId, затем myBean. Это может оставить myBean в сломанном состоянии на некоторое время.

Я могу использовать, чтобы исправить эту проблему следующим образом:

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