java - 使用 SpEL 更新 Spring bean 属性的值

标签 java spring expression

我正在使用 Spring 3 创建一个 Web 应用程序,并且希望利用 Spring 表达式语言的强大功能,但遇到了问题。我需要将一个 bean 上的属性值设置为另一个 bean 上的方法调用的结果。我知道我可以做到这一点,但问题是该方法调用的结果可能会在 bean 初始化后发生变化,并且我需要该属性来反射(reflect)更改。例如:

<beans>
 ...
 <bean name="guestList" class="java.util.ArrayList"></bean>

 <bean name="party" class="some.custom.class.Party">
  <property name="numberOfGuests" value="#{guestList.size()}" />
 </bean>
 ...
</beans>

据我所知,numberOfGuests 字段是在第一次访问 party 字段时设置的。但访问 party 字段后,客人数量可能会发生变化,我需要 numberOfGuests 字段来反射(reflect)这一点。每当我需要更新值时,有没有办法重新初始化应用程序中的 numberOfGuests 字段?

这只是一个示例,直接访问 guestList bean 不适用于我的具体情况。

最佳答案

如果您将范围设置为原型(prototype),那么每次 Spring 加载您的 bean 时,它都应该重新计算 guest 列表大小:

 <bean name="party" class="some.custom.class.Party" scope="prototype">

因此,party 成为原型(prototype),但 guestList 可以保持单例(这是默认范围)。

但有一个问题:如果您有另一个 bean,例如 partyHost (这是一个单例),并且它会被注入(inject) party (这是一个原型(prototype)), partyHost 永远不会获得 party 的另一个实例,因为 partyHost 是一个单例,并且只会将依赖项注入(inject)其中一次。因此,要使其正常工作,所有需要更新 guest 列表大小的 Bean 以及引用它们的所有 Bean 等都必须是原型(prototype)。

要么这样,要么你必须直接通过他们的 API 询问 Spring。如果您使用该 API,则可以随时调用它并获取原型(prototype) bean 的新实例,从而获得更新的 guest 列表大小。

applicationContext.getBean("myPrototype");

但是,如果可以的话,最好避免使用 Spring API。通常,开发人员不想耦合到 DI 框架。

关于java - 使用 SpEL 更新 Spring bean 属性的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4228800/

相关文章:

c# - Expression.Compile 中捕获的内容

java - 如何使用它的参数扩展java @Interface

java - 获取 Spring 应用程序上下文

r - 如何以斜体打印小写希腊三角洲 [ggplot 轴标题]

java - 具有多个参数的 Java 8 的 Function.Function

java - 查找与模式匹配的所有 CLASSPATH 资源

R - 从字符串创建函数

java - 如何找到 jface swt 文档?

java - JPA:我应该将 BLOB 存储在与 fetch Lazy 相同的表中,还是应该将其存储到另一个表并 fetch lazy 一对一关系

java - 方法 sort(Map<Integer,Object>) 不适用于参数 (Map<Integer,Entity>)