3

依存性注入について質問があります。

私はクラスを持っています、言う:

class MyClass {
    MyServiceAPI serviceAPI;
    public setSession(Session session) {
         serviceAPI = new MyServiceAPI(session);     
    }
    ....
}

セッションは、実行時にデータベースからロードする別のクラスによって作成されます。

class MyAnotherClass {
    Myclass myClass;

    @Inject
    MyAnotherClass(MyClass myClass) {
        this.myClass = myClass;
    }

    public someFunction() {
        String key = <read from database>;
        Session session = new Session(key);
        myClass.setSession();
        ......
    }
}

説明したように、MyClass インスタンスは MyAnotherClass に注入され、MyClass 内の serviceAPI インスタンスは new を使用して作成されます。ServiceAPI を MyClass に注入したい場合は、セッションが作成されたクラスでそれを作成し、セッターを使用して MyClass に設定することができます。

しかし、問題は、MyAnotherClass に MyServiceAPI を作成させて MyClass に注入させたくないということです。MyAnotherClass が MyServiceAPI の存在を認識しないようにします。

Guice や Spring などの依存性インジェクターを使用してこれを行う方法はありますか? それとも単にJava?

どうもありがとう。

4

4 に答える 4

1

純粋な Java で依存性注入を行う場合は、組み込みの Java サービス プロバイダー インターフェイスを介して Java 6 の時点でいくつかのサポートがあります。ただし、jarファイルなどを使用した配管が必要です.Java SPIについては、こちらをご覧ください

于 2012-04-18T19:18:56.630 に答える
1

Guice と単純な工場で可能な解決策。MyServiceAPI はインターフェイスにすることができます。

public class MyClass {

    @Inject
    private MyServiceFactory factory;
    private MyServiceAPI myServiceAPI;

    public void setSession(Session session) {
        myServiceAPI = factory.createMyServiceAPI(session);
    }
}

public class MyServiceFactory {

    MyServiceAPI createMyServiceAPI(Session session) {
        // create with new, inject via Injector, do what you want... :)
        return <yourobject>;
    }
}
于 2012-04-18T19:43:30.573 に答える
0

依存関係を並べ替える必要があるかもしれません。繰り返しますが、完全なコードを知らなければ、これはちょっと難しいですが、あなたの例を見ると、次のことが当てはまるようです。

  • MyClass実際にはに依存し、に依存しMyServiceAPIませんSessionMyServiceAPIしたがって、コンストラクターに直接注入する必要があります。

  • SessionそのsessionId(または何でも)コンストラクターに注入する必要があります。その値をGuiceでバインドできるため、次のようになります@Inject @SessionId public Session(String sessionId)sessionIdまたは、と一部の両方をSessionServiceに注入してSession、サービスから独自のデータを取得できるようにすることもできます。

  • MyServiceAPISessionそれに注入する必要があります。

于 2012-04-18T19:53:10.070 に答える
0

これには、古き良き工場を使用する必要があります。

class MyAnotherClass {
    MyClassFactory myClassFactory;

    @Inject
    MyAnotherClass( MyClassFactory myClassFactory ) {
        this.myClassFactory = myClassFactory;
    }

    public void someFunction() {
        String key = "1"; // read from DB
        myClass = myClassFactory.getMyClass( key );
    }
}

class MyClassFactory {
    public MyClass getMyClass( String key ) {
        Session session = new Session( key );
        MyClass myClass = new MyClass();
        myClass.setSession( session );
        return myClass;
    }
}
于 2012-04-18T19:52:25.290 に答える