【问题标题】:"Recycling" names within a spring application context在 Spring 应用程序上下文中“回收”名称
【发布时间】:2009-06-05 15:55:45
【问题描述】:

可以说,我的 Spring 应用程序上下文中有很多看起来像这样的东西

<bean name="foo.0001" class="com.example.MyClass">
    <property name="name" value="foo.name.0001"/>
    <property name="zap">
        <bean class="com.example.Other">
            <property name="name" value="foo.name.0001"/>
        </bean>
    </property>
    <property name="bar">
        <bean class="com.example.NextOther">
            <property name="name" value="foo.name.0001"/>
        </bean>
    </property>
</bean>

所以字符串 foo.name.0001 多次出现在 bean 定义中。因为它是一个更大的系统,有几个这样的配置块,修改这些ID中的每个是很烦人的。理想情况下,我只想在一个块内设置一次。是否有可能设置某种只存在于 bean 定义的本地范围内的属性?

【问题讨论】:

  • 您到底想达到什么目的?如果子 bean 中的名称值与父 bean 中的名称相同,那么以某种方式引用父 bean 不是更好吗?
  • 我只是想消除必须再次指定这些名称的冗余。因为如果我复制整个块,在这种情况下,我必须将这些事件中的每一个更改 3 次,但我只想调整一次。问题是,在过去配置应用程序时,我遇到了复制和粘贴错误,因为在某些情况下我忘记更改定义中的名称,这可能会导致非常细微的错误。
  • 好的,但是这些名称相同的根本原因是什么?如果是这样,您是否可以不使用引用而不必多次指定它们?
  • 这是我的问题,我唯一需要的是引用的范围仅在定义的 bean 内,因为如果引用的名称不同,则在第一名。

标签: java spring


【解决方案1】:

我不确定这在逻辑上是如何工作的,因为您仍然必须以某种方式引用该值才能将其传递给嵌套 bean。如果您担心多次定义它,可以查看 Springs PropertyPlaceholderConfigurer。它将允许您执行以下操作:

<property name="bar">
   <bean class="com.example.NextOther">
      <property name="name" value="${foo.name.001}"/>
   </bean>
</property>

这将允许您定义一次,并从多个位置引用它。

【讨论】:

  • 但如果我复制该块,我仍然需要更改 foo.name.001 的 所有 次出现,这正是我想要避免的
【解决方案2】:

这取决于您要为此付出多少努力,但您的要求可以通过 spring 自定义命名空间来满足。当您有许多相同的 bean 块,每个块的配置不同时,这些是理想的。

基本上,您将定义 xml 架构,然后编写一个 bean 定义解析器,根据需要设置 bean。

更多详情请看这里:

http://www.javaworld.com/javaworld/jw-02-2008/jw-02-springcomponents.html

这就是 Spring security 简化其 xml 配置的方式。

【讨论】:

  • 很公平 - 但春天你没有很多其他选择。您可以创建一个为您创建层次结构的工厂类。总而言之,我认为您不会找到不需要付出努力的解决方案。
猜你喜欢
  • 2015-10-01
  • 2016-05-20
  • 1970-01-01
  • 2013-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-09
  • 1970-01-01
相关资源
最近更新 更多