我有一个无法控制的静态方法:MyUtils.getServiceURL()
,它返回一个 URL。我需要从此 URL 中提取端口来设置 bean 的属性:
<bean id="myBean>
<property name="defaultPort" value="?????"/>
</bean>
我可以将 URL 的字符串值作为 bean 获取,如下所示:
<bean id="serviceURL" class="MyUtils" factory-method="getServiceURL" />
我可能只是要编写一个方法来解析 myBean
中的 URL 并提取端口。我想知道是否有一种方法可以避免这样做,并直接在 spring 上下文中配置它?
最佳答案
不需要自定义类或解析器。请记住,bean 只是一个具有 get/is/set 方法的类。一个java.net.URL
类符合这样的资格。
解决方案:使用 java.net.URL
作为 Spring 可配置 bean 并将其称为 getPort
方法。
请记住,在 Spring 中,您可以非常轻松地将任何内容连接为 bean,只要它使用 get/is/set Bean 约定来实现方法即可。 java.net.URL 类做了这样的事情。
**警告**我只是从我的a$$中输入这个,你必须检查我可能在这个Spring配置伪代码中引入的任何语法恶作剧。可以肯定的一件事是,该概念将适用于 Spring 2.5,并且它依赖于 util
架构。
如果您使用的是旧版本的 Spring,则必须使用 PropertyPathFactoryBean
。如果您使用 Spring 3.0,您会想要使用 Spring 表达式语言(EL),但我无法评论后者,因为我对 Spring 3.0 不熟悉。
在java中:
int port = (new URL(MyUtils.getServiceURL()).getPort()
Spring :
<bean id="serviceURL" class="MyUtils" factory-method="getServiceURL" />
<bean id="myURL" class="java.net.URL">
<constructor-arg>
<ref-bean="serviceURL"/>
</constructor-arg>
</bean>
<util:property-path id="defaultPort" path="myURL.port"/>
<bean id="myBean>
<property name="defaultPort" ref="defaultPort"/>
</bean>
可能有一种方法可以将所有这四个表达式合并为三个或更少,但不知道这是否会提高可读性。不过,这个概念仍然是一样的。对待java.net.URL
实例作为 bean,通过其构造函数设置其 URL,并获取(通过 Spring)其 getPort()
的保留。方法。
** 编辑 **: 如果您使用 Spring 2.5,您可以创建一个内联 groovy bean 来为您完成所有这些工作。我见过人们这样做作为集成粘合剂来摆脱大量临时 Spring bean 占位符。在我看来,当您需要定义一个类(当它比仅使用 Spring 标签更简单)并且您知道这样的类不会在 Spring 连接之外使用时,这是最好的选择。
关于java - 使用 spring,我可以提取静态方法的某些部分来用于设置 bean 的属性吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4998894/