理想情况下,我想从代码中执行此操作:
@Value("#{aPropertiesFactoryBean.aProperty}")
private String aProperty;
基于spring配置,我在其中设置PropertyPlaceholderConfigurer和PropertiesFactoryBean,并将配置器bean作为ref传递给bean,配置器生成的所有内容都作为工厂bean的属性公开。
有一个黑客可以从Configurer重新定义每个属性,如:
<bean id="aPropertiesFactoryBean"
class="org.springframework.beans.factory.config.PropertiesFactoryBean">
<property name="singleton" value="true" />
<property name="properties">
<props>
<prop key="aProperty">${aProperty}</prop>
</props>
</property>
</bean>
然后每次向Configurer添加属性时,都必须使用FactoryBean重新公开它。简而言之,我想要配置器的所有管理功能,并且还能够从spring xml文件和@Value注释中引用同一批属性。
所以这两个问题:
注意,我不是在寻找可以让我快速上路的东西,现在上面有关于PropertiesFactoryBean的黑客攻击就足够了。我希望找到或制作一个可重复使用的组件,我可以用它来轻松管理未来项目的可注射属性。
答案 0 :(得分:3)
我只是在考虑这个问题。这个配置正是我想要的,能够在xml配置中定义属性,可以从属性文件覆盖,并且可以作为占位符属性和可注入值使用。
<beans
xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<!--
One-stop shopping for properties here.
Available as injected values and elsewhere in the spring config.
-->
<bean id="injectableProperties"
class="org.springframework.beans.factory.config.PropertiesFactoryBean">
<property name="singleton" value="true" />
<property name="ignoreResourceNotFound" value="true" />
<property name="properties">
<props>
<prop key="prop1">value1</prop>
<prop key="prop2">value2</prop>
</props>
</property>
<!-- Allow foo.conf to override default properties -->
<property name="location" value="file:/etc/foo/foo.conf" />
</bean>
<!-- Expose the properties so other parts of the spring config can use them -->
<bean id="propertyPlaceholderConfigurer"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="ignoreResourceNotFound" value="true" />
<property name="ignoreUnresolvablePlaceholders" value="false" />
<property name="properties" ref="injectableProperties"/>
</bean>
</beans>
答案 1 :(得分:0)
也许我误解了这种情况,但您可以通过使用语法来注入属性而无需定义PropertiesFactoryBean
:
@Value("${my.property}") String myProperty;