2011-09-20 34 views
1

假設我們有一個Java包。這個包可以在任何地方使用。但是,這個包中有一些代碼依賴於上下文。例如,如果使用這個包的應用程序是一個Web應用程序,我們需要通過在執行其他任務時調用一個函數來執行一些任務,如果應用程序是一個控制檯應用程序通過調用相同的函數。如何檢測Java代碼的應用程序類型

這裏是我的問題:

是否有在java中的任何方式的代碼中,如果運行應用程序的Web應用程序或控制檯,我們可以檢測? 我感謝所有幫助:)

作爲一個現實世界的例子,我們加載屬性文件是爲Web和控制檯應用程序不同的方式。

對於Web應用程序,我們可能會使用this.getClass().getClassLoader().getResourceAsStream(url)和控制檯應用程序,我們使用new FileInputStream(physical path)

回答

2

這可能是最好設置一個構建屬性的地方而不是試圖檢測到您的應用程序類型,因爲我不認爲這是一個可靠的方法來做到這一點。

而且你不應該試圖檢測應用類型,因爲你的視圖層(無論是Web,桌面或控制檯)應根據現代建築原理很容易互換。


迴應您的上次評論。

正如user384706說DI是正確的選擇在這裏IMO。 我會舉一個春天的例子。

在您的控制檯和Web應用程序的部分都可以有:

public class WebOrConsoleServiceImpl { 

    private PropertyProvider propertyProvider = new NullPropertyProvider(); 

    // and 

    public void setPropertyProvider(PropertyProvider impl) { 
     this.propertyProvider = impl; 
    } 

    // and in your service logic 

    public void logic() { 

     final Properties props = propertyProvider.loadProperties(); 
     // do stuff    
    } 
} 

如果您loadProperties()方法將被重寫你PropertyProvider的不同實現。

而在你的Spring上下文,你可以有:

<bean id="consolePropertyProvider" class="com.company.ConsolePropertyProvider"/> 

<bean id="myConsoleService" class="com.company.MyConsoleService"> 
    <property name="propertyProvider" ref="consolePropertyProvider" /> 
</bean> 

而同一對bean定義爲您的WebServiceWebPropertyProvider

+0

我希望有相同的代碼,但它不工作。我提出的一個關於加載屬性的例子是我的問題之一。如果我知道應用類型,那麼我可以把正確的代碼,否則我不知道該怎麼做:( – tecfield

+0

你不能設置一個構建屬性的地方?你如何建立你的項目?蟻?maven?手動?在任何情況下,你應該有一些構建文件?在該文件中,你可以添加諸如deployment.type = [web | console | desktop]之類的東西,然後根據您的部署更改該值。這是檢測應用程序類型IMO – Simeon

+0

這是同一個項目,不能這樣做! – tecfield

1

只需使用dependency injection
只需放置所有合適的參數以通過setter配置庫,並讓容器或應用程序使用DI相應地配置它。
所以,你不需要任何檢查,恕我直言,這是一個不錯的辦法

+0

以避免硬編碼,我不能這樣做。依賴性注射是好的,但如果你不需要經常改變你的設置。 – tecfield

+0

+1:是的DI可能是最好的(標準?)的方法 – Simeon

0
  1. 的J2EE方式。如果您的包在Web應用程序中使用,那麼我假設您在J2EE容器中,那麼您可以在部署時的命名中添加一個Reference。您還可以註冊一個MDB,該MDB可以監聽對該引用的更改並在運行時修改代碼的行爲。甜的權利?

  2. 其中可以傳遞調用者上下文的其他標準方式是通過參數化工廠或屬性。

  3. 一個非標準的方式 - 爲樂趣是get the stack trace,尋找誰調用者或尋找J2EE上下文等

+0

會嘗試#3。聽起來可行但不確定它是否可靠:D thnx – tecfield

+0

3號絕對不可靠,因爲您事先不知道調用者可能是誰,但它肯定是可行的調用Thread.currentThread()。getStackTrace()然後遍歷它。 – RHT

相關問題