3

3 層アーキテクチャとして設計された Java Web アプリケーションを使用しています。現在、2 つの異なるデータベース レイヤーがあります。すべてのデータ アクセス レイヤー コードは、1 つのパッケージに集中しています。目的のデータ層は構成ファイルで定義されます。そのため、構成ファイルに応じて別のパッケージをインポートする必要があります。どちらのデータ層も、DBfacade オブジェクトを介してビジネス層と通信します。インポートする必要があるパッケージを決定することはできますか、または DBfacade の名前を変更して、2 つの異なる名前を持ち、両方のパッケージをインポートする必要がありますか?

4

3 に答える 3

2

別々のパッケージで同じ名前と同じメソッド シグネチャを持つ 2 つのクラスを作成し、インポートを変更してこの実装を切り替える場合、非常に悪い設計を使用しています。非常に悪いデザイン。

import セクションはコンパイルするまでのみ存在することに注意してください。次に、バイトコードで完全修飾参照を取得します。

インターフェイスと実装を使用し、IoC またはリフレクションを使用して実装を切り替えます。または、両方の実装をインポートし、if を介してどちらを呼び出すかを決定しますが、IoC を使用すると柔軟性が向上します (たとえば、コードを変更せずに新しい実装を追加する機能)。

于 2013-03-20T12:18:39.863 に答える
1

importステートメント自体はコンパイル時に処理されるため、「構成ファイルに応じて異なるパッケージをインポートする」ことはできません。

ただし、構成に応じて異なるライブラリを使用できます。たとえば、 interface Foo:の 2 つの異なる実装があり、異なるファイルに配置されているFooOne場合、ファイルから構成を取得する実装の 1 つをロードする factory を実装できます。FooTwojarFooFactory

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();
    }
}
于 2013-03-20T12:36:06.073 に答える
0

データレイヤーは環境に依存しますか?その場合は、JNDIを使用してデータソースを公開することを検討してください。これにより、環境は低レベルの詳細をカプセル化できます。

データソースにJNDIを使用する理由を参照してください。

于 2013-03-20T11:54:01.727 に答える