EJB3 / JBossのでavaStatic工場パターン
質問
私は、EJBとJava EEの限られた使用して、私のキャリアのほとんどの特別な目的のスタンドアロンのJavaアプリケーションで書かれたと働いたJBossのような本格的なアプリケーションサーバ、にかなり新たなんです。静的工場パターン:私は、EJB3とJBossに一般的に使用されるデザインパターンを適応させるための最善の方法に疑問を抱いています。実際には、これはジョシュアブロッホの効果的なJavaの帳にアイテム#1である(第2版)
私は現在、次の工場で働いています:
public class CredentialsProcessorFactory {
private static final Log log = LogFactory.getLog(CredentialsProcessorFactory.class);
private static Map<CredentialsType, CredentialsProcessor> PROCESSORS =
new HashMap<CredentialsType, CredentialsProcessor>();
static {
PROCESSORS.put(CredentialsType.CSV, new CSVCredentialsProcessor());
}
private CredentialsProcessorFactory() {}
public static CredentialsProcessor getProcessor(CredentialsType type) {
CredentialsProcessor p = PROCESSORS.get(type);
if(p == null)
throw new IllegalArgumentException("No CredentialsProcessor registered for type " + type.toString());
return p;
}
私はPersistenceContext
インターフェースインターフェースCredentialsProcessor
をした、とのimplのそれぞれは、@Local
でマークされたように、しかし、CredentialsProcessorの実装クラスでは、私は、そのよう@Stateless
として注入されたリソースを必要とします。今、私はJNDIでそれらを見て、注入されたリソースを使用することができます。
しかし、私はもう工場を使用していないので、今、私は切断を持っています。私が最初に考えたのはJNDIルックアップを実行し、要求されSLSBインスタンスを返すためにgetProcessor(CredentialsType)
方法を変更することでしたが、その後、私は設定する必要があり、適切な修飾JNDI名を渡します。私はその道を行く前に、私は受け入れプラクティスに関するより多くの研究をやってみたかったです。
このデザインパターンは、EJB3で扱われているどのように/のJava EE - ?
解決
あなたは工場や「本物」のJava POJOコードで再生を開始するとき、あなたは基本的にJNDIに頼る必要がます。
依存性の注入のみEJBサーバの管理対象コンポーネント上で動作し、それは基本的にサーブレットとEJBのです。
あなたがEJBに参照したい一般的なJavaコードを話しているとき、彼らはJNDI経由でリソースそのものを検索する必要があります。
行うための最善のことは、その場合には、単純ではなく、各実装に直接JNDIを呼び出すよりも、自分のJNDIルックアップを行うには、静的な機能で満たされたラッパー・ルックアップ・クラスを記述しています。そして、あなたの実装でそれを使用ます。
これだけの一般的な全体的なルールです。
さて、あなたの特定のケースのために、これを考慮します。
あなたが持ってます:
static {
PROCESSORS.put(CredentialsType.CSV, new CSVCredentialsProcessor());
}
:と何ら変わりません。
static {
PROCESSORS.put(CredentialsType.CSV, "java:comp/env/ejb/CSVCredentialProcessorSessionBean");
}
次に、あなたのgetProcessorで()のコード:
Context c = new InitialContext();
return (CredentialsProcessor) c.lookup(PROCESSORS.get(type));
を参照してくださいは、基本的に、コードは同じであり、あなたの工場インターフェースは、クライアントに同じである。
あなたは「ハードコード」JNDIルックアップキーを持っていますが、あなたが今、とにかくクラス名を「ハードコーディング」しているので、どのようにこの異なる?
でありますコンテナ間でいくつかの潜在的な移植性の問題があります、そのみんなで豆名の異なるJNDI識別子を使用したいようです。そのほとんどは、展開に微調整することができますが、ない場合は、設定ファイルの中でこれらのキーを引き出し、または何でもすることができます。
のJava EE 6では、保証ポータブル名前があります。あなたは今日のコンテナを移植していない場合は、すべてではこの程度ではない心配を行います。
だから、基本的に、それは本当にすべての切断ではありません。
他のヒント
EJB3を使用すると、一般的にJNDIルックアップを行う必要はありません。 EJB3サポート EJBとリソースのいくつかの他の種類の依存性注入する。あなたの豆属性が@EJB
の注釈が付けられている場合、依存関係を自動的にコンテナによって注入されます。
あなたはユニットテストの目的のためにPOJOのようなあなたのEJBをテストすることができますJNDI検索手段を行う必要がありません。あなたは依存関係とテストそれらのちょうど手動注入モック実装は、コンテナでそれらを展開することなくすることができます。