Объявление явной зависимости объекта в Spring - PullRequest
3 голосов
/ 14 января 2010

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

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

Вот фиктивная манера установки 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>

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

1 Ответ

5 голосов
/ 14 января 2010

Вы можете добавить явную зависимость от одного компонента к другому, используя атрибут 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...