【问题标题】:Spring - how to reference another property within the same bean?Spring - 如何在同一个bean中引用另一个属性?
【发布时间】:2017-02-24 04:18:18
【问题描述】:

我的配置中有以下定义:

<bean class="com.project.TimerBean">
    <property name="delay" value="30000" />
    <property name="interval" value="60000" />
    <property name="invokeThis" value="com.project.TargetClass" />
    <property name="receiver" value="XYZ" />
    <property name="args" value="#{interval}" />
</bean>

我想将args 的值设置为与interval 相同的值(在本例中为60000),而无需对值进行硬编码。但是,上面的 sn-p 似乎不起作用。我应该如何改变这个?

【问题讨论】:

    标签: spring properties-file


    【解决方案1】:

    # 语法(Spel 表达式)应该按照您编写的方式工作。你需要更换

    #{interval} to #{beanId.interval}.

    例如,如果您正在创建的 bean 的 id 是 timerBean,那么 #{timerBean.interval} 应该可以工作。即使属性是 bean 定义的一部分,您也不能直接引用它。

    仅当您引用的属性是另一个 bean 的一部分时才有效。

    <bean id="beanA" class="org.BeanA">
      <property name="prop1" value="1000" />
    </bean>
    
    <bean id="beanB" class="org.BeanB">
      <property name="prop2" value = "#{beanA.prop1}" />
      <property name="prop3" value = "#{beanB.prop2}" />
    </bean>
    

    在上面的例子中,prop2 是从 prop1 正确初始化的。但是 prop3 被初始化为 null。

    如果你看一下 AbstractAutowireCapableBeanFactory 类和方法,

    protected void applyPropertyValues(String beanName, BeanDefinition mbd, BeanWrapper bw, PropertyValues pvs)
    

    您可以看到单个 bean 定义中的所有属性值都被循环并解析了值。在成功解析所有值之后,才在 bean 实例上设置它们。在上面的 beanA 和 beanB 示例中,当解析 prop3 的值时,spring 会在 beanB 上查找尚未设置的 prop2 的值,因此返回 null。

    AFAIK,除了@Alex 建议的方式外,没有其他办法

    PS:我使用的是spring版本4.1.6.RELEASE

    【讨论】:

      【解决方案2】:

      将间隔值“60000”移动到属性文件中

      yourVariableName = 60000
      

      并更改为:

      <property name="interval" value="${yourVariableName}" />
      <property name="args" value="${yourVariableName}" />
      

      【讨论】:

      • 对不起,我需要澄清一下你的回答。你的意思是我应该在同一个文件中创建一个变量,但在 bean 的范围之外?
      • 您需要创建your.properties 文件。你可以在这里找到一个例子:docs.spring.io/spring/docs/current/spring-framework-reference/…(“例子:类名替换PropertyPlaceholderConfigurer”)。
      猜你喜欢
      • 2015-10-23
      • 2012-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-18
      • 1970-01-01
      • 2010-12-08
      • 2017-01-03
      相关资源
      最近更新 更多