2010-01-14 3 views
3

Основная проблема, с которой я столкнулся, состоит в том, что у меня есть один файл xml, который используется в качестве файла утилиты и импортируется в другие файлы xml. Он определяет серию объектов для подключения к платформе и предоставляет для нее интерфейс. Бобы в этом файле определены как lazy-initialized, так что если вы не хотите подключаться к платформе, вы не будете, но если вы начнете ссылаться на соответствующий компонент, тогда все должно встать и работать.Объявление оспариваемой зависимости объекта весной

Основная проблема, с которой я сталкиваюсь, состоит в том, что один из компонентов этого набора не является экспликацией, на которую ссылается какой-либо другой, но она должна быть сконструирована так, как она будет вызывать метод на одном из других компонентов, чтобы " активировать "его. (Он действует как хранитель ворот путем включения/выключения подключения на основе того, что он определяет как состояние платформы).

Вот манекен рода настройки XML у меня есть:

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:util="http://www.springframework.org/schema/util" 
    xsi:schemaLocation=" 
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd 
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-2.5.xsd" 
    default-lazy-init="true"> 

    <!-- Provides the connection to the platform --> 
    <bean id="PlatformConnection"> 
     <constructor-arg ref="PlatformConnectionProperties" /> 
    </bean> 

    <!-- This bean would be overriden in file importing this XML --> 
    <bean id="PlatformConnectionProperties"/> 

    <!-- Controls the databus to be on/off by listening to status on the Platform 
     (disconnections/reconnections etc...) --> 
    <bean lazy-init="false" class="PlatformStatusNotifier"> 
     <constructor-arg ref="PlatformConnection" /> 
     <constructor-arg ref="PlatformConnectionDataBus" /> 
    </bean> 

    <!-- A non platform specific databus for client code to drop objects into - 
     this is the thing that client XML would reference in order to send objects out --> 
    <bean id="PlatformConnectionDataBus" class="DataBus"/> 

    <!-- Connects the DataBus to the Platform using the specific adaptor to manage the java object conversion --> 
    <bean lazy-init="false" class="DataBusConnector"> 
     <constructor-arg> 
      <bean class="PlatformSpecificDataBusObjectSender"> 
       <constructor-arg ref="PlatformConnection" /> 
      </bean> 
     </constructor-arg> 
     <constructor-arg ref="PlatformConnectionDataBus" /> 
    </bean> 

</beans> 

Сейчас в основном я хочу, чтобы удалить ленивый inits здесь, которые необходимы, чтобы получить эту вещь, чтобы работать должным образом. Объектами, на которые ссылается клиентский XML, являются PlatformConnection и PlatformConnectionDataBus. Как я могу объяснить, что я хочу, чтобы эти другие бобы были построены, если на них ссылаются?

ответ

5

Вы можете добавить явную зависимость от одного бин к другому, используя depends-on атрибут:

<bean id="a" class="A"/> 
<bean id="b" class="B" depends-on="a"/> 

Если я понять Ваши правильно проблемы качества, то я предлагаю вам сделать все ваши бинов lazy-init="true", и использовать depends-on, чтобы связать их вместе, например:

<bean id="PlatformStatusNotifier" lazy-init="false" class="PlatformStatusNotifier"> 
    <constructor-arg ref="PlatformConnection" /> 
    <constructor-arg ref="PlatformConnectionDataBus" /> 
</bean> 

<bean id="PlatformConnectionDataBus" lazy-init="false" class="DataBus" depends-on="PlatformStatusNotifier"/> 

Так что, если ваш клиент конфигурации должны были выразить зависимость от PlatformConnectionDataBus, то это вызовет инициализацию PlatformConnectionDataBus, что, в свою очередь, вызовет инициализацию PlatformStatusNotifier.

Смежные вопросы