具有属性解析的Spring工厂bean

具有属性解析的Spring工厂bean,spring,Spring,是否可以对Springbean声明的Factorybean字段进行属性解析 例如: <bean factory-bean="$APP{some.factory.bean}" factory-method="..."> Spring版本:3.2.4在Spring上下文中添加 <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <

是否可以对Springbean声明的Factorybean字段进行属性解析

例如:

<bean factory-bean="$APP{some.factory.bean}" factory-method="...">

Spring版本:3.2.4

在Spring上下文中添加

<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="locations">
            <list>
                <value>classpath:yourfile.properties</value>
            </list>
        </property>
        <property name="ignoreResourceNotFound" value="false" />
        <property name="ignoreUnresolvablePlaceholders" value="false" />
    </bean>

刚刚遇到了相同的问题(使用Spring 4.2.0)。似乎工厂bean的属性解析不起作用,不管它们在中说了什么。我最终使用了
ProxyFactoryBean
作为解决方法

不起作用的所需配置:

<!-- The bean to be created: factory type determined in runtime -->
<bean id="..." factory-bean="factory-${factory.type}" factory-method="..." />

<!-- Possible factories -->
<bean id="factory-A" class="..." />
<bean id="factory-B" class="..." />
<bean id="factory-C" class="..." />

我发现的解决方法是:

<!-- The bean to be created: use factory proxy -->
<bean id="..." factory-bean="factory-proxy" factory-method="..." />

<!-- The factory proxy: real factory type determined in runtime -->
<bean id="factory-proxy" class="org.springframework.aop.framework.ProxyFactoryBean">
    <property name="target" ref="factory-${factory-type}" />
</bean>

<!-- Possible factories -->
<bean id="factory-A" class="..." />
<bean id="factory-B" class="..." />
<bean id="factory-C" class="..." />


享受:)

为了测试这一点,我已经更改了最新的Spring的PetClinic示例,但我仍然得到
NoSuchBeanDefinitionException:没有定义名为“$APP{some.factory.bean}”的bean
。您可以检查我的更改。@andresp:如果您将该属性注入到其他bean的值中,它会得到解析吗?config.properties是一个新文件吗?如果是,添加后是否重新部署?是。对对只有当解析用于bean本身的名称时,解析才会失败。我的假设是,Spring只在创建bean之后进行属性解析,因此此功能在现阶段不可用。更新的代码。@andresp:Spring首先创建bean定义,替换bean定义中的占位符值,然后才创建bean。也许在这种情况下,它是有限的,因为这是一个依赖项而不是一个值,这些可能会首先得到解决?!很抱歉,这显然不是“在创建bean之后”(这意味着构造函数仍然会被占位符调用),我想说的是“在创建bean的内部表示之后”。我假设,当工厂bean自己创建新bean时,属性解析只会在调用工厂方法之后发生(因此我们有可用的启动bean的完整列表)。为了调用这些方法,Spring需要知道bean名称,因此创建失败,因为它仍然不知道定义引用的是哪个工厂bean。
<!-- The bean to be created: use factory proxy -->
<bean id="..." factory-bean="factory-proxy" factory-method="..." />

<!-- The factory proxy: real factory type determined in runtime -->
<bean id="factory-proxy" class="org.springframework.aop.framework.ProxyFactoryBean">
    <property name="target" ref="factory-${factory-type}" />
</bean>

<!-- Possible factories -->
<bean id="factory-A" class="..." />
<bean id="factory-B" class="..." />
<bean id="factory-C" class="..." />