Struts アクションで Singleton クラスをインスタンス化すると、そのアクションを起動する他のリクエストに対して永続的になりますか?
つまり、もし私が Struts アクション コードを使用していて、次のように書いたとします。
Singleton object = Singleton.getInstance();
別のユーザーがそのオブジェクトを必要とする同じアクションまたは別のアクションを起動したときに、オブジェクトは存在しますか?
Struts アクションで Singleton クラスをインスタンス化すると、そのアクションを起動する他のリクエストに対して永続的になりますか?
つまり、もし私が Struts アクション コードを使用していて、次のように書いたとします。
Singleton object = Singleton.getInstance();
別のユーザーがそのオブジェクトを必要とする同じアクションまたは別のアクションを起動したときに、オブジェクトは存在しますか?
適切に実装されSingleton
た は、アプリケーションのコンテキスト内で一度構築され、作成されると JVM 内で再利用されます。シングルトン パターンウィキペディアのページには、(一部) と書かれています。
ソフトウェア エンジニアリングでは、シングルトン パターンは、クラスのインスタンス化を 1 つのオブジェクトに制限する設計パターンです。これは、システム全体でアクションを調整するために 1 つのオブジェクトだけが必要な場合に役立ちます。
はい。ASingleton
はグローバル変数の形式であるため、すべてのユーザーが共有するインスタンスは 1 つだけです。
私はあなたの疑問を理解します:
Struts2 アクションはThreadLocal
であるため、すべてのアクションはすべてのリクエストで、そのオブジェクトのインスタンスを作成します。シングルトンは正しく動作しますか?
あなたのコードから、1.5*より前の Singletonを参照しているようです:
public class Singleton {
private static final Singleton INSTANCE = new Singleton();
private Singleton() {}
public static Singleton getInstance() {
return INSTANCE;
}
}
答えはイエスです:
private static final Singleton INSTANCE = new Singleton();
にstatic
「勝ち」ThreadLocal
、それを一意にします(一度インスタンス化されてから共有されます)。
@Singleton
*Java EE >= 6 を使用している場合、 EJB や@Singleton
インジェクションなど、CDI、EJB3 などを使用して、これよりも優れたシングルトンを処理する多くの方法があることに注意してください。