2011-02-15 50 views
2

我有一个静态方法,我无法控制:MyUtils.getServiceURL()它返回一个URL。我需要从这个URL只提取端口上设置一个bean的属性:使用spring,我可以提取一些静态方法的一部分用来设置一个bean的属性?

<bean id="myBean> 
    <property name="defaultPort" value="?????"/> 
</bean> 

我能得到的URL字符串值作为这样一个bean:

<bean id="serviceURL" class="MyUtils" factory-method="getServiceURL" /> 

我可能只是要编写一个方法来解析myBean中的URL并提取端口。我想知道是否有办法避免这样做,并直接在春季环境中配置它?

+0

将java.net.URL视为一个bean(请参阅下面的答案)。 – 2011-02-16 01:44:55

回答

2

无需自定义类,或解析器。请记住,一个bean只是一个具有get/is/set方法的类。 A java.net.URL类符合此类要求。

解决方案:使用java.net.URL作为Spring配置bean,并将其称为getPort方法。

记住,在春天,你可以很容易的,只要是体育用GET /是/套 Bean的常规方法的任何连线作为。 java.net.URL类做了这样的事情。

**警告**我只是在我的$ $$中输入了这个内容,您必须检查我可能在这个Spring-config伪代码中引入的任何语法错误。有一点可以肯定的是,这个概念将在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,并通过其getPort()方法获得一个暂挂(通过Spring)。


** **编辑: 如果您在使用Spring 2.5,您可以创建一个内嵌的Groovy豆,做一切你。我见过人们这样做一体化胶水摆脱众多临时春豆的地方持有人。当你需要定义一个类(当它比使用Spring标记更简单时)以及当你知道这样的类不会在Spring的布线之外使用时,这是IMO的最佳选择。

1

不是我能想到的。无论哪种方式,你可能不得不写一些东西来解析端口。由于您无法控制该静态方法,因此您可能需要使用adapter pattern来隐藏该静态方法。这样做也使得您的代码更易于测试,因为您可以轻松地嘲笑该外部API。例如: -

public interface URLServiceAdapter { 
    int getServiceURLPort(); 
} 

public class URLServiceAdapterImpl implements URLServiceAdapter { 
    public int getServiceURLPort() { 
     return MyUtils.getServiceURL().getPort(); 
    } 
} 

你的豆然后将依赖于你的适配器类,而不是MyUtils.getServiceURL()直接: -

<bean id="urlServiceAdapter" class="project.URLServiceAdapterImpl" /> 

这样一来,你可以做这样的事情: -

@Autowired 
private UrlServiceAdapter urlServiceAdapter; 

... 

bean.setDefaultPort(urlServiceAdapter.getServiceURLPort()); 
+0

谢谢@limc,我喜欢使用适配器的想法。我想避免用URL的概念来污染我的bean;它不应该关心。 – BigBen 2011-02-15 18:14:26

1

SpEL是你的朋友。

<bean id="myBean> 
    <property name="defaultPort" 
    value='#{ T(com.foo.MyUtils).getServiceURL().split(":")[2].split("/")[0] }'/> 
</bean> 

享受,

相关问题