xml - 一种在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()}"
解决方案
您可以使用 2 种方法为 bean 设置任意数量的标识符:
在属性中提供尽可能多的标识符
name
,用逗号 (,)、分号 (;) 或空格分隔。使用
<alias>
. 当您想要指向另一个系统/子系统中的 bean 时,这种方法很有用,因为它在文档中有完整描述:
但是,指定实际定义 bean 的所有别名并不总是足够的。有时需要为在别处定义的 bean 引入别名。这在大型系统中很常见,其中配置在每个子系统之间进行拆分,每个子系统都有自己的一组对象定义。在基于 XML 的配置元数据中,您可以使用该元素来完成此操作。
所以要回答你的问题,是的,你可以用name
属性来做
对于奖金问题,您需要使用Bean Scopes
推荐阅读
- ssh - Bitbuket 管道 - 如何设置 ssh
- c# - HttpWebRequest C# 的 API 超时错误 | 与邮递员和restsharp一起工作
- apache-spark - ConnectException:从 test/127.0.0.1 到 localhost:9000 的调用失败
- ios - UIDatepicker 用'---'显示未来年份
- html - 在 iOS 上,Safari:如何防止底层页面/主页滚动但超出覆盖范围。覆盖应该能够滚动
- ios - 将对象保存为用户默认值
- javascript - 当 javascript 提示某些内容时,网页变为空白
- java - 无法访问 application.properties 文件
- php - Isset 适用于本地服务器,但不适用于实时服务器
- c# - 如何从 WPF 设置 Windows 10 及更高版本的锁屏壁纸?