Weld における外部 (サードパーティ) Bean の解決
-
20-09-2019 - |
質問
この仕様がリリースされたのはほんの数か月前なので、まだあまり普及していないことは承知しています。
私はまだ weld を「インストール」していません。読んでいるだけです。この質問によって、この重要な点を正しく理解していることを確認したいと思います。
サードパーティの jar 内の Bean の解決は、次のように宣言することで実現されますか? <alternatives>
あなたの中で beans.xml
?
そうでない場合は、次の機能を持たないサードパーティ ライブラリの Bean を使用する方法 beans.xml
?
jar をクラスパスに置くことは、存在しない限り機能しません。 beans.xml
彼らの中で META-INF
, 、これはサードパーティの jar では実現できません。(見る この件に関するギャビン・キングの投稿)
解決
なぜそう複雑だと思う?
単にこれらのサードパーティクラスのproducerMethodを行います。
あなたは自動的にPDFファイルを受け取り、faximileごとに送信し、サードパーティのライブラリを持っていると仮定しましょう、そしてあなたは、
のようなものを使用したいですprivate @Inject PdfFaxService faxService;
あなたのコードでは、あなたは単にプロデューサメソッドでこれを提供することができます。 PdfFaxServiceはステートレス働くので、私たちは安全に我々はそれが@ApplicationScoped
作ることができると仮定することができます:
public @Produces @ApplicationScoped PdfFaxService createFaxService() {
return new PdfFaxService(initparameters);
}
どこかでます。
HTHます。
他のヒント
私の理解 代替 それは、別のデプロイメント環境 (例:テスト環境)。アン 代替 Bean は、次の注釈を付けることで宣言されます。 @Alternative
.
特定の展開シナリオで代替手段を使用するには、 <alternatives>
CDI デプロイメント記述子の要素 META-INF/beans.xml
. 。これにより、 @Alternative
デフォルトでは無効になっている Bean です。
有効にすると、コンテナーが特定の注入ポイントのあいまいな依存関係を見つけた場合、注入できる代替案を調べ、正確に 1 つ存在する場合は、この代替案を選択します。
言い換えると、 代替案 を置き換える良い方法です 既存の実装 デプロイメント時に別のものを使用します。置き換えるものがない場合は、代替手段は必要ありません。jar をクラスパスに置くだけです。これがまさにあなたの質問であるかどうかはわかりませんが、サードパーティの jar の概念には疑問があります。
でより多くの 2.1.4.代替案, 4.6.代替案 そして 4.7.満たされていない曖昧な依存関係を修正する (しかし、あなたが読んでいるのはこれだと思います)。
アップデート: 追加の質問に答えるため。
そうでない場合、beans.xml を持たないサードパーティ ライブラリの Bean を使用する方法
これは起こり得ません。Bean アーカイブには bean.xml
(空であっても)セクションで詳しく説明されています 15.6。パッケージ化と展開 ドキュメントの:
CDIは特別な展開アーカイブを定義していません。豆、ejb-jars、またはwarsに豆をパッケージ化できます。これは、アプリケーションクラスパスの展開場所です。ただし、アーカイブは、 しなければならない「Bean アーカイブ」になります。つまり、豆を含む各アーカイブに名前が付けられたファイルを含める必要があります
beans.xml
の中にMETA-INF
クラスパスのディレクトリまたはWEB-INF
ウェブルートの WARアーカイブ)。ファイルが空である可能性があります。のないアーカイブに配置された豆。 を持つ。beans.xml
ファイルは アプリケーションで使用可能。
次に、満たされていない曖昧な依存関係を修正するには、前述のセクション 4.7 を参照してください。
更新 2: を使用しているようです BeforeBeanDiscovery.addAnnotatedType()
Bean の検出中に考慮される他のクラスを追加することができます。(BeforeBeanDiscovery
イベントです)