【发布时间】: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 实例
-
你能重新格式化你的文档吗,元素
<bean name="string3" id="string3" value="#{string1}">没有结束标签 -
@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