2013-03-20 75 views
3

我有一個設計爲三層架構的Java Web應用程序。目前我有兩個不同的數據庫層。我的所有數據訪問層代碼都集中在一個包中。所需的數據層在配置文件中定義。所以應該根據配置文件導入另一個軟件包。兩個數據圖層都通過一個DBfacade對象與業務層進行通信。是否可以決定應該導入哪個軟件包,還是應該重命名我的DBfacade,以便我有兩個不同的名稱並導入這兩個軟件包?取決於配置的Java包導入

+5

有沒有條件包裝的產品進口在Java中。根據你的問題描述,我建議你開始閱讀控制反轉(IOC)。 – Perception 2013-03-20 11:55:09

回答

0

數據層是否依賴於環境?如果是這樣,請考慮使用JNDI公開數據源。這將允許環境封裝低級細節。

請參閱Why use JNDI for data sources

2

如果您在獨立包中製作2個具有相同名稱和相同方法簽名的類,並且您通過更改導入在這些實現之間切換,則正在使用非常糟糕的設計。非常糟糕的設計。

請注意,導入部分直到編譯才存在。然後你在字節碼中有完全限定的引用。

使用接口和實現,在使用IoC或反射的實現之間切換。或者導入這兩個實現並決定通過if調用哪一個,但IoC爲您提供了更大的靈活性(例如,無需更改代碼即可添加新實現)。

1

import語句本身在編譯時處理,因此您不能「根據配置文件導入不同的包」。

但是,您可以根據您的配置使用不同的庫。例如,如果您有接口Foo 2種不同的實現方式:FooOneFooTwo位於不同jar文件,你可以實現工廠FooFactory加載以配置從文件中的實現方式之一,如:

public class FooFactory { 
    public Foo createFoo() throws Exception{ 
     Properties props = new Properties(); 
     props.load("/var/config.properties"); 
     return Class.forName(props.getProperty("foo.class")).newInstance(); 
    } 
}