我需要在运行时设置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被声明为抽象。
答案 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。