1

OSGi バンドル内でカスタム アノテーションが付けられたすべてのクラスを検索したいのですが、
実際のスキャンはバンドル自体の内部で行うか、別のバンドルから行う必要があります。
を使用してみClassPathScanningCandidateComponentProviderましたが、例外が発生します:

java.io.FileNotFoundException: URL [bundleresource://38.fwk29597962/my/base/package/] cannot be resolved to absolute file path because it does not reside in the file system: bundleresource://38.fwk29597962/my/base/package/

私は 99% 確信してreflectionsいます。または他のスキャン ライブラリのようなソリューションも機能しませんでした。理由は覚えていません。

次のように component-scan を設定できます。

<context:annotation-config />
<context:component-scan base-package="my.base.package" use-default-filters="false">
    <context:include-filter type="annotation" expression="path.to.my.annotation"/>
</context:component-scan>

Bean ファクトリから必要なものを取得しますが、注釈付きのすべてのクラスに @Scope("prototype") を追加する必要があるため、Spring はデフォルトでシングルトンを作成しません。
より良い解決策はありますか?

-注釈付きのクラスに @Component や spring に関連するもの が
ない

4

1 に答える 1

3

実行時ではなくビルド時にスキャンを実行する準備ができている場合は、bnd に使用できる便利なマクロがあります。

MyAnnotated-Classes: ${classes;CONCRETE;ANNOTATION;org.example.MyAnnotation}

...これMyAnnotated-Classesにより、マニフェストにヘッドが生成され、バンドル内の@MyAnnotation. 実行時にこのヘッダーをスキャンするのは簡単です。

このアプローチは、実行時のクラスパス スキャンよりも大幅に最適化されています。また、の内容をキャッチする必要があるため、実行時スキャンは信頼できない可能性がありますがBundle-ClassPath、インポートされた/必要なクラスは避けてください。

于 2013-10-01T12:39:42.360 に答える