Весна:Получение объекта FactoryBean вместо FactoryBean.getObject()
-
11-09-2019 - |
Вопрос
Короткий вопрос: Если у меня есть класс, который реализует интерфейс 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="&theFactoryBean" />
Другие советы
Вы можете получить сам фабричный компонент, используя команду &
синтаксис в конфигурации Spring:
<property name="factoryBean" ref="&theFactoryBean" />
в отличие от:
<property name="createdBean" ref="theFactoryBean" />