Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用SpEL更新springbean属性的值_Java_Spring_Expression - Fatal编程技术网

Java 使用SpEL更新springbean属性的值

Java 使用SpEL更新springbean属性的值,java,spring,expression,Java,Spring,Expression,我正在使用Spring3创建一个web应用程序,希望利用Spring表达式语言的强大功能,但遇到了一个问题。我需要将我的一个bean上的属性值设置为另一个bean上的方法调用的结果。我知道我可以做到这一点,但问题是该方法调用的结果可能会在bean初始化后更改,我需要该属性来反映更改。例如: <beans> ... <bean name="guestList" class="java.util.ArrayList"></bean> <bean na

我正在使用Spring3创建一个web应用程序,希望利用Spring表达式语言的强大功能,但遇到了一个问题。我需要将我的一个bean上的属性值设置为另一个bean上的方法调用的结果。我知道我可以做到这一点,但问题是该方法调用的结果可能会在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对我的特定情况不起作用。

示例#{guestList.size()}只设置属性的初始值,而不设置使其保持最新的策略。假设您没有使用延迟加载,Spring会在启动时从应用程序上下文实例化Spring管理的bean。从那时起,由开发人员负责更新属性值

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

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

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

我想最简单的方法是将列表(
guestList
)注入bean,并在每次需要
numberOfGuests
时从Java代码手动调用其
.size()
方法,即:

package some.custom.class;

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

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

}
打包some.custom.class;
公营党{
私人名单宾客名单;
//接球手和接球手
public int getNumberOfGuests(){
return guestList!=null?guestList.size():0;
}
}
而且

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


这绝对是最简单(也是首选!)的方法,但OP说“这只是一个示例,直接访问guestList bean不适合我的具体情况。”你说得对。我明白了。我们当然需要更多的信息。直接访问
guestList
bean有什么问题?
<bean name="party" class="some.custom.class.Party">
  <property name="guestList" ref="guestList"/>
 </bean>