2

私はいくつかのJave EE 6コードをレビューしており、その正確性について疑問を持っています:

@WebServlet
public class FooServlet {
  @EJB
  private transient BarRemoteInterface bar;
}

@Remote
public interface BarRemoteInterface {
}

@Stateless
public class BarBean implements BarRemoteInterface {
}
  • transient挿入されたプロキシがシリアル化されないため、キーワードが意味をなさないというのが本当かどうか疑問に思っています。(または、影響はありませんか?)

  • コピーごとのパラメータ受け渡しを使用するため、リモート インターフェイスを注入しない方が効果的だと思います。代わりに、@EJB BarBean自動的に生成される (?) ローカル インターフェイスが使用されるように、EJB を注入します。私は正しいですか?

  • この場合、より一般的であるため、@EJBを に置き換えることもできます@Inject

私の考えが正しいかどうかコメントしてもらえますか?

4

1 に答える 1

3

挿入されたプロキシがシリアル化されないため、一時的なキーワードが意味をなさないというのが本当かどうか疑問に思っています。(または、影響はありませんか?)

トランジェントは必要ありません。EJB 仕様では、リモート プロキシはシリアライズ可能でなければならないと規定されています。必要に応じて、インターフェイスを Serializable に拡張できます。

pass-by-copy パラメーターの受け渡しを使用するため、リモート インターフェイスを注入しない方が効果的だと思います。代わりに、EJB に @EJB BarBean を注入して、自動的に生成された (?) ローカル インターフェイスが使用されるようにします。私は正しいですか?

そうです、@Remote本質的には「コピー渡し」です(実際にはそうではありませんが、これで十分です)。一部のアプリケーション コンテナーは、とにかくこれを最適化できます。@Remote実際にリモートしている場合にのみ使用してください。また、リモーティングは絶対に避けるべきです。SOA のようなアーキテクチャは遅く、スケールアウトが不可能なことで知られています。@Localやむを得ない正当な理由がない限り、そのままにしておいてください。

この場合、@EJB を @Inject に置き換えることもできます。これは、より一般的な方法です。

ええ、お気軽に@InjectEJB をご利用ください。JEE6 コンテナー (TomEE、JBoss7、GlassFish など) はこれを把握できます。実際のところ、本当に EJB が必要なのか自問してみてください。純粋な CDI でタスクを達成できますか? EJB は、トランザクションのセマンティクスについて心配する必要がある場合にのみ役立ちます。それ以外の場合は、CDI を使用してください。

それが役立つことを願っています!

于 2013-04-12T16:51:09.427 に答える