Java EE 6 での Contexts and Dependency Injectionの記事を参照してください。それは言います:
@Stateful
Bean は、注入中にコンテナーによって作成されます。
したがって、JSP がコンパイルおよび実行されると、コンテナーは新しいCalenderBean
.
Bean をシングルトンにしたい場合は、アノテーションを として宣言し、ステートレスにするのが最善@Stateless
です。その動作は、インスタンス変数の状態に依存してはなりません。つまり、2 つのスレッドが Bean に同時にアクセスする場合、インスタンス変数を変更することによって、Bean の相互の動作に影響を与えることはできません。
たとえば、CalenderBean にインスタンス変数private Calendar calendar
があり、インスタンス メソッドが次のような処理を行う場合:
this.calendar.set(Calendar.YEAR, input.getYear()); // where input is a parameter
// to the method you were calling
return calendar.get(Calendar.ERA);
ここで、2 人の訪問者がまったく同じインスタンスで Web ページにアクセスするが、入力が異なるとします。
- ユーザー 1
input.getYear()
は2000
- ユーザー 2
input.getYear()
は-5
2 つのスレッドが順番に処理されることを保証できないため、次のことが発生する可能性があります。
- ユーザー 1 にサービスを提供するスレッドは、年を
2000
- ユーザー 2 にサービスを提供するスレッドは、年を
-5
- ユーザー 1 にサービスを提供するスレッドは、ERA を設定して を返します
GregorianCalendar.BC
。
これは明らかに間違っています。ユーザー 1 がCalendarBean
ユーザー 2 の動作に影響を与えているため、Bean はステートレスではありません。