以下の内容はhttps://unageanu.hatenablog.com/entry/20090724/1248427391より取得しました。


JerseyのServiceクラス探索がどうなっているのか調べてみた

JAX-RSの実装であるJaersyでは、アノテーションを付与したサービスクラスを自動で探索して、デプロイしてくれます。マッピングを指定するわけでもなく、もちろん「META-INF/services/...」とかも不要。んー、内部実装はどうなってるんだろー、気になるー!、ということで調べてみた。

結果

以下のような仕組みでした。

  1. java.util.jar.JarFile」を使ってクラスパスに含まれるjarを展開。
  2. エントリを列挙して「.class」で終了するファイルを探索し、
  3. マッチしたエントリをASMで解析。
  4. クラスに指定されたアノテーションがついていれば、サービスと見なして一覧に追加。

探索のメインクラスはjersey-server-1.1.1-ea.jarに含まれる「com.sun.jersey.server.impl.container.config.AnnotatedClassScanner」になります。ソースはMavenリポジトリの「jersey-server-1.1.2-ea-SNAPSHOT-sources.jar」の中にあります。

んー、これだとクラスパス上にjarが大量にある場合、探索に時間がかかるんでは・・・・。とはいえ、「META-INF/services/...」などがいらないのはメリットなので、マッピングを明示的に指定しない場合に使える探索方式の一つとして提供されている、とかなら活用できそう。あと、クラスの解析にASM使ってるのはポイントかも。バイトコードを直接読んでるので、探索してもクラス自体はロードされないはず。ふむふむ。




以上の内容はhttps://unageanu.hatenablog.com/entry/20090724/1248427391より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14