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

StackOverflow https://stackoverflow.com/questions/1655140

Вопрос

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

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

<!-- 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>

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

Я хотел бы упростить конфигурацию, используя один фабричный компонент (удалить «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>

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

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

Еще одна сложность, которая меня немного беспокоит, — это цепочки Фабрик (Фабрика1 получает объект от Фабрики2, который мне приходится «подцепить» во время выполнения).

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

Это было полезно?

Решение

Это & (амперсанд), а не символ At, см. документацию Spring Framework: Настройка логики создания экземпляров с помощью FactoryBeans

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

Другие советы

Вы можете получить сам фабричный компонент, используя команду & синтаксис в конфигурации Spring:

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

в отличие от:

<property name="createdBean" ref="theFactoryBean" />
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top