首页 > 解决方案 > 一种在spring xml中将一个bean指向另一个bean的方法

问题描述

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

目的是创建 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()}"

标签: xmlspringseparation-of-concerns

解决方案


基于官方 Spring 3.x 文档

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

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

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

但是,指定实际定义 bean 的所有别名并不总是足够的。有时需要为在别处定义的 bean 引入别名。这在大型系统中很常见,其中配置在每个子系统之间进行拆分,每个子系统都有自己的一组对象定义。在基于 XML 的配置元数据中,您可以使用该元素来完成此操作。

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

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


推荐阅读