繁体   English   中英

Spring设置了抽象bean属性值

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM