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

Spring: получение объекта FactoryBean вместо FactoryBean.getObject()

Короткий вопрос: Если у меня есть класс, который impelemnts интерфейс FactoryBean, как я могу получить из самого объекта FactoryBean вместо FactoryBean.getObject()?

Длинный вопрос: Я должен использовать 3-х стороннюю библиотеку Spring, которая вряд ли использует интерфейс FactoryBean. Сейчас я всегда должен настроить 2 beans:

<!-- Case 1-->
<bean id="XYZ" class="FactoryBean1" scope="prototype">
    <property name="steps">
        <bean class="FactoryBean2">
            <property name="itemReader" ref="aName"/>
        </bean>
    </property>
</bean>

<bean id="aName" class="com.package.ClassName1" scope="prototype">
    <property name="objectContext">
        <bean class="com.package.ABC"/>
    </property>
</bean>

<!-- Case 2-->
<bean id="XYZ2" class="FactoryBean1" scope="prototype">
    <property name="steps">
        <bean class="FactoryBean2">
            <property name="itemReader" ref="aName2"/>
        </bean>
    </property>
</bean>

<bean id="aName2" class="com.package.ClassName1" scope="prototype">
    <property name="objectContext">
        <bean class="com.package.QWE"/>
    </property>
</bean>

Фактическая деинсталляция bean с именем "XYZ" (сравните с "XYZ2" ) никогда не будет изменена, но из-за природы factory я должен скопировать код для каждой конфигурации. Определение bean с именем "aName" всегда будет новым (т.е. Каждая конфигурация будет иметь собственное значение objectContext).

Я хотел бы упростить конфигурацию, имея один factory bean (удалить "XYZ2" и избавиться от ссылки на "aName" ):

<bean id="XYZ" class="FactoryBean1" scope="prototype">
    <property name="steps">
        <bean class="FactoryBean2"/>
    </property>
</bean>

<bean id="aName" class="com.package.ClassName1" scope="prototype">
    <property name="objectContext">
        <bean class="com.package.ABC"/>
    </property>
</bean>


<bean id="aName2" class="com.package.ClassName1" scope="prototype">
    <property name="objectContext">
        <bean class="com.package.QWE"/>
    </property>
</bean>

К сожалению, это не так просто, как я ожидаю. Я полагаю, что клей factory (т.е. XYZ bean из примера) с необходимыми объектами (т.е. "AName", "aName2" ) во время выполнения. Подход не работает, потому что, когда я спрашиваю Spring для объекта FactoryBean, он возвращает мне FactoryBean.getObject(), который невозможно установить в это время из-за отсутствия значения itemReader.

Я надеюсь, что SpringSource предвидит мое дело. Я могу вызвать "hook" FactoryBean.getObject(), чтобы предоставить все необходимые свойства во время выполнения.

Еще одна сложность, которая меня немного беспокоит цепочки фабрик (Factory1 получает объект от Factory2, который я должен "зацепить" во время выполнения).

Любые идеи будут оценены.

4b9b3361

Ответ 2

Вы можете сами получить factory bean, используя синтаксис & в конфигурации spring:

<property name="factoryBean" ref="&theFactoryBean" />

в отличие от:

<property name="createdBean" ref="theFactoryBean" />