2010-11-19 65 views
0

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

<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字段来反映这一点。当我需要更新值时,有没有办法在我的应用程序中重新初始化numberOfGuests字段?

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

回答

2

如果您将范围内的每个弹簧加载你的bean应该重新计算的嘉宾名单大小时间为原型则:

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

所以,party变成样机,但guestList可以留单(这是默认的范围)。

这里有一个问题是:如果你有另外一个bean,像partyHost(这是一个单),并获取与party注射(这是一台样机),partyHost将永远不会得到party另一个实例,因为partyHost是单例,并且只获得一次注入的依赖关系。因此,要实现这一点,所有需要更新客人列表大小的bean以及所有引用它们的bean等都必须是原型。

要么,要么你必须通过他们的API直接询问Spring。如果您使用API​​,则可以随时调用它并获取原型bean的新实例,并因此更新来宾列表大小。

applicationContext.getBean("myPrototype"); 

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

0

#{guestlist.size()}的示例仅设置属性的初始值,而不是用于保持最新的策略。假设你没有使用延迟加载,Spring在启动时从应用程序上下文中实例化Spring管理的bean。从这一点开始,开发人员需要处理更新的属性值。

0

我猜最简单的办会注入名单(guestList)到bean,并调用其.size()从Java代码,每次手工方法需要numberOfGuests,即:

package some.custom.class; 

public class Party { 
    private List<?> guestList; 
    // getter & setters 

    public int getNumberOfGuests() { 
    return guestList!=null ? guestList.size() : 0; 
    } 

} 

和...

<bean name="party" class="some.custom.class.Party"> 
    <property name="guestList" ref="guestList"/> 
</bean> 
+0

这绝对是最简单的(也是首选!)方法,但OP表示“这只是一个例子,直接访问guestList bean不适用于我的具体情况。” – 2010-11-23 21:42:34

+0

你说得对。采取的点。我们当然需要更多的信息。直接访问'guestList' bean有什么问题? – 2010-11-23 21:59:38