[英]Spring set abstract bean property value
我需要在运行时运行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被声明为abstract。
Spring应用程序上下文包含bean定义 ,Spring实例化由这些定义定义的bean对象。
您当前的代码获取从命名bean定义创建的对象,并更改其属性。 但是, abstract
bean从不实例化为对象,它们仅以定义的形式存在,这些定义由具体bean的定义继承。
因此,如果要更改抽象bean的属性,则需要更改其定义,这可以使用BeanFactoryPostProcessor
来完成。 但请注意,后处理器是在容器启动期间应用的,因此如果您希望它实际上是“运行时”,则此方法不适用。
免责声明:这是未经测试的; 脱离我的头顶。 不确定它是否会在init阶段后工作。
您需要获取ConfigurableListableBeanFactory
实例。 您的appcontext可能是一个,所以您可以投射它。
从那里,获取bean定义并更改属性。
ConfigurableListableBeanFactory clbf = (ConfigurableListableBeanFactory)context;
BeanDefinition fooDefinition = clbf.getBeanDefinition("abstractFoo");
MutablePropertyValues pv = fooDefinition.getPropertyValues();
pv.add(propertyName, newValue);
也许您需要在此之后使用ConfigurableListableBeanFactory
重新注册beandefinition。 我不是百分百肯定; 你必须测试一下。
请记住,如果它有效,它将仅适用于在更改后实例化的bean。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.