3

私はJAXB 2.0バージョンで作業しています。このためJAXBContextに、次の方法でオブジェクトを作成しています。

package com;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;

public class JAXBContextFactory {

    public static JAXBContext createJAXBContext() throws JAXBException {
        JAXBContext jaxbContext = JAXBContext.newInstance(Customer.class);

        return jaxbContext;
    }

}

JAXBContext 基本的に JAXBContext の作成は非常にコストがかかるため、アプリケーション全体で一度だけ作成したいと考えています。JAXBContextそのため、上記のように静的メソッドの下にコードを配置しました。

JAXBContextFactory.createJAXBContext();これで、への参照が必要になるたびに、リクエストは を呼び出しますJAXBContex今私の質問は、この場合、JAXBContext作成されたのは一度だけですか、それともアプリケーションには複数のインスタンスがありJAXBContextますか?

4

5 に答える 5

5

このメソッドが呼び出されるたびに、アプリケーションは JAXBContext のインスタンスを 1 つ持ちます。

これが発生したくない場合は、次のことを行う必要があります

package com;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;

public class JAXBContextFactory {

    private static JAXBContext context = null;
    public static synchronized JAXBContext createJAXBContext() throws JAXBException {
        if(context == null){
            context = JAXBContext.newInstance(Customer.class);
        }
        return context;
    }

}

これとあなたの実装の違いは、この実装では、作成された JAXBContext のインスタンスを静的変数 (一度だけ存在することが保証されている) に保存することです。実装では、作成したばかりのインスタンスをどこにも保存せず、メソッドが呼び出されるたびに新しいインスタンスを作成するだけです。重要: メソッド宣言にキーワードを追加することを忘れないでください。synchronizedこれにより、マルチスレッド環境でこのメソッドを呼び出しても期待どおりに動作することが保証されます。

于 2012-06-13T15:13:02.177 に答える
3

実装は、リクエストごとに新しい JAXBContext を作成します。代わりに、次のことができます。

public class JAXBContextFactory {
    private static JAXBContext jaxbContext;

    static {
        try {
            jaxbContext = JAXBContext.newInstance(Customer.class);
        } catch (JAXBException ignored) {
        }
    }

    public static JAXBContext createJAXBContext() {
        return jaxbContext;
    }

}
于 2012-06-13T15:13:19.733 に答える
3

メソッドは、呼び出されるたびに明らかに新しい JAXBContext を作成します。

メソッドが呼び出された回数に関係なく、インスタンスが 1 つだけ作成されるようにしたい場合は、Singleton Patternを探しています。その実装は次のようになります。

public class JAXBContextFactory {
  private static JAXBContext INSTANCE;
  public static JAXBContext getJAXBContext() throws JAXBException {
    if (JAXBContextFactory.INSTANCE == null) {
      INSTANCE = JAXBContext.newInstance(Customer.class);
    }
    return INSTANCE;
  }
}

このインスタンスは、Java クラスローダごとにのみ一意であることに注意してください。

于 2012-06-13T15:14:05.280 に答える
2

メソッドが呼び出されるたびに、1 つのインスタンスが作成されます。コンテキストを使用するstaticことは、インスタンスがないことを意味しますJAXBContextFactory

おそらく、代わりに使用するのは

public enum JAXBContextFactory {;

    private static JAXBContext jaxbContext = null;

    public synchronized static JAXBContext createJAXBContext() throws JAXBException {
        if (jaxbContext == null)
            jaxbContext = JAXBContext.newInstance(Customer.class);
        return jaxbContext;
    }

}
于 2012-06-13T15:13:31.567 に答える