2011-02-15 40 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> 

享受,

相關問題