Spring设置了抽象bean属性值

时间:2011-03-31 10:23:25

标签: java spring

我需要在运行时设置spring bean属性值。目前我正是这样做的

Object bean = context.getBean(beanName);
BeanWrapper wrapper = PropertyAccessorFactory.forBeanPropertyAccess(bean);
wrapper.setPropertyValue(propertyName, newValue);

但是有些bean被配置为抽象

<bean id="abstractFoo" abstract="true" class="com.Foo" />

<bean id="bar" class="com.Bar">
    <constructor-arg><bean parent="abstractFoo" /></constructor-arg>
</bean>

并且在这种情况下context.getBean("abstractFoo")抛出BeanIsAbstractException

这是一个非常简单的例子,但我希望你能得到这个想法。

知道如何更改抽象bean的属性值(在本例中为'abstractFoo')? 我们正在使用spring 2.5.4

修改

将XML示例更改为更具体。由于安全原因,abstractFoo被声明为抽象。

2 个答案:

答案 0 :(得分:2)

Spring应用程序上下文包含 bean定义,Spring实例化由这些定义定义的bean对象。

您当前的代码获取从命名bean定义创建的对象,并更改其属性。但是,abstract bean永远不会被实例化为对象,它们仅以定义的形式存在,这些定义由具体bean的定义继承。

因此,如果要更改抽象bean的属性,则需要更改其定义,这可以使用BeanFactoryPostProcessor来完成。但请注意,后处理器是在容器启动期间应用的,因此如果您希望它实际上是“运行时”,则此方法不适用。

答案 1 :(得分:0)

免责声明:这是未经测试的;脱离我的头顶。不确定它是否会在初始阶段之后起作用。

您需要获得ConfigurableListableBeanFactory的实例。你的appcontext可能是一个,所以你可以投它。

从那里,获取bean定义并更改属性。

   ConfigurableListableBeanFactory clbf = (ConfigurableListableBeanFactory)context;
   BeanDefinition fooDefinition = clbf.getBeanDefinition("abstractFoo");
   MutablePropertyValues pv = fooDefinition.getPropertyValues();
   pv.add(propertyName, newValue);

在此之后,您可能需要使用ConfigurableListableBeanFactory重新注册beandefinition。我不是百分百肯定;你必须测试它。

请记住,如果它有效,它只适用于在更改后实例化的bean。