我正在使用 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/