代码之家  ›  专栏  ›  技术社区  ›  Cameron

使用SpEL更新Spring bean属性的值

  •  0
  • Cameron  · 技术社区  · 15 年前

    我正在使用Spring 3创建一个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 字段被访问。但是在 聚会 字段被访问,来宾数可能会更改,我需要 客人人数 以反映这一点。有没有办法重新初始化 客人人数 每当我需要更新值时,我的应用程序中的字段?

    这只是一个例子,访问 guestList 豆子直接对我的具体情况不起作用。

    3 回复  |  直到 15 年前
        1
  •  2
  •   Brad Cupit Regan    15 年前

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

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

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

    但是有一个陷阱:如果你有另一个豆子,比如 partyHost (这是一个单粒子),它被注入 聚会 (这是一个原型), 派对主持人 再也找不到 聚会 ,自 派对主持人 是单例的,并且只向其注入一次依赖项。因此,要实现这一点,需要更新来宾列表大小的所有bean,以及引用它们的所有bean等都必须是原型。

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

    applicationContext.getBean("myPrototype");
    

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

        2
  •  0
  •   Mike Yockey    15 年前

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

        3
  •  0
  •   Grzegorz Oledzki    15 年前

    我想最简单的办法就是把名单( guestList )给豆子打电话 .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>