【问题标题】:a way to point one bean to another in spring xml一种在spring xml中将一个bean指向另一个bean的方法
【发布时间】:2019-10-24 17:08:01
【问题描述】:

除了别名之外,有没有办法使用 Spring XML SPring 表达式语言 (SPEL) 将一个 bean 指向另一个? 下面的 string4 使用别名。但 string3 没有。 string3 不起作用,因为您不能将值属性放在 bean 标记中。但它不是构造函数参数,也不是参数。它是事物本身。写string3的正确方法是什么?有spel的写法吗?

目的是创建 2 个 bean,string1 和 string2。可能是其他种类的物体。但是这里的 String 是为了简化示例。另一个对象将通过名称“string3”请求一个 bean。它不知道 string1 或 string2;只是它需要string3。在 xml 中,我们可以将 string3 映射到 string1 或 string2,这取决于部署的情况。

例如在服务器 1 上,我们将 string3 指向 xml 中的字符串 1。在服务器 2 上,我们将 string3 指向 xml 中的字符串 2。它使应用程序不必知道我们是否需要 string1 或 string2。我们只在 xml 中进行该分配。保留 SoC。

<?xml version="1.0" encoding="UTF-8"?>

   <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:util="http://www.springframework.org/schema/util"
        xmlns:context="http://www.springframework.org/schema/context"
        xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/util
        http://www.springframework.org/schema/util/spring-util-2.5.xsd
        http://www.springframework.org/schema/context
        https://www.springframework.org/schema/context/spring-context.xsd">

    <context:component-scan base-package="somePackage.SomeClass"/>

    <bean name="string1" id="string1" class="java.lang.String">
        <constructor-arg value="some string one"/>
    </bean>

    <bean name="string2" id="string2" class="java.lang.String">
        <constructor-arg value="another string two"/>
    </bean>

    <bean name="string3" id="string3" value="#{string1}"/>
    <!--
    <bean name="string3" id="string3" value="#{string2}"/>
    -->

    <!--
    <alias name="string2" alias="string4"/>
    -->
    <alias name="string1" alias="string4"/>

    <bean name="testBean" id="testBean" class="somePackage.SomeClass"/>

</beans>

额外问题:有没有一种方法可以创建 bean 的副本,而不仅仅是传递对同一个 bean 的引用?像 value="#{string1.clone()}"

【问题讨论】:

  • 您可以制作 string1 bean 原型,然后每个 bean 将有不同的 string1 实例
  • 你能重新格式化你的文档吗,元素&lt;bean name="string3" id="string3" value="#{string1}"&gt;没有结束标签
  • @AndreiSfat,关于如何使 string3 分配工作的任何想法?
  • 我回答了copy of a bean 位。对于您尝试将一个 bean 名称分配给另一个 bean 名称所做的事情,并没有真正的意义。你确定你没有滥用 Spring 来完成你想要完成的事情吗?直接做参考有什么问题?
  • @AndreiSfat, "string1" 定义了一个在多个地方都需要的 bean。除了在不同的地方使用的 getBean(name) 不同。例如,我试图让 getBean("string3") 获取 string1 的实例。并且 getBean("string4") 也获取 string1 bean。别名工作,当然。但它不像说“string3 = string1”那么明确。这似乎也不太可能产生 string3 的重复项。

标签: xml spring separation-of-concerns


【解决方案1】:

基于official Spring 3.x documentation:

您可以使用 2 种方法为 bean 设置任意数量的标识符:

  1. name 属性中提供尽可能多的标识符,以逗号 (,)、分号 (;) 或空格分隔。

  2. 使用&lt;alias&gt;。当您想要指向另一个系统/子系统中的 bean 时,这种方法很有用,因为它在文档中有完整描述:

指定实际定义 bean 的所有别名不是 然而,总是足够的。有时需要引入一个 在别处定义的 bean 的别名。这是常见的情况 在配置在每个子系统之间拆分的大型系统中, 每个子系统都有自己的一组对象定义。在基于 XML 的 配置元数据,可以使用元素来完成 这个。

所以要回答你的问题,是的,你可以用name 属性来回答

对于奖金问题,您需要使用Bean Scopes

【讨论】:

  • 有没有办法使用拼写而不是别名?
  • @scorpdaddy 你说的SpEL是什么意思?支持 SpEL 的特定元素?
  • SPring 表达式语言,如上面的 string3 所示。
  • 有 SpEL 方法吗?
猜你喜欢
  • 1970-01-01
  • 2017-09-07
  • 1970-01-01
  • 2017-06-18
  • 1970-01-01
  • 2012-11-19
  • 1970-01-01
  • 1970-01-01
  • 2014-01-24
相关资源
最近更新 更多