2

Springの昔ながらのDIから来たので、CDIで書いているときにスコープを正しく選択する方法がわかりません。

Springでは、すべてのサービスにデフォルトでシングルトンスコープがあります。これはCDI(または@Singleton)のアプリケーションスコープにマップされると思います。たとえば、ログインしたユーザー情報については、セッションスコープを使用する必要があり、フォームパラメータについては、リクエストスコープが必要です。

外部サービスAPI呼び出しを非表示にするBeanがあるとします。完全にステートレスです。私はそれをアプリケーションスコープとして置くべきですか、@Singletonそれとも単にアプリケーションスコープにするべきですか?または、すべてのリクエストで作成されるようにします(おそらく悪いオプション)。

これはすべてをどこにでも注入するのに正しいですか?Springでは、によってデータオブジェクトを作成しますnew。CDIでも同じことをするべきですか、それとも単に@Injectそれらを行うべきですか?

4

3 に答える 3

1

CDIのみを使用していますか?それとも Java EE 6 コンテナーですか? サービス呼び出しに使用されるステートレス クラスがある場合は、EJB 仕様の @Stateless を使用することをお勧めします (そのため、Java EE 6 コンテナーが必要になります)。これはシングルトンではありませんが、そうではありません。リクエストごとに作成されます。セッションにより密接にバインドされていると思いますが、ステートレスであるため、インスタンスをプールして共有できます。CDI のみを扱っている場合、Singleton は Spring の singleton とより直接的に一致すると思いますが、ApplicationScoped を使用する Bean のシリアル化を容易にするプロキシを提供するため、ApplicationScoped を使用することをお勧めします。

于 2012-10-18T23:45:11.273 に答える
0

Beanがその状態を記憶する必要がある理由はありますか?Webクライアントのようなものを使用している場合は、状態を格納するのに適した場所です。たとえば、セッションスコープのマネージドBean(jsfを想定)など、ケースに相当するものを使用します。バックエンドサーバー側では、オーバーヘッドを最小限に抑え、「シンプルに保つ」パラダイムを支援するために、EJBを@statelessとして保持する方が適切です。これが機能する場合は、Beanで@Statelessを宣言するだけです。シングルトンを使用する理由がない限り、サービスにJava EEコンテナーを使用する場合は、ステートレスBeanを使用することをお勧めします。

ステートレスBeanは、すべてのリクエストで実際に再作成されるわけではありません。それがプールの目的です。アプリサーバーはステートレスBeanの準備が整った状態を維持し、ビジー状態になるとさらに多くを生成し、静まると一部が空になります。

于 2012-10-22T01:35:35.083 に答える
0
@Service
@Scope("prototype")
public class CustomerService 
{
......
}

コンポーネントに @Scope("prototype") アノテーションを追加するだけです。

于 2012-10-18T22:37:28.037 に答える