JavaのSPI、servlet3.0ソースコード解析と@HandlesTypes

非常に洗練され、ここでのJavaのSPIとservlet3.0のアプリケーションでは、それが次のアドレスにリンクします。

https://blog.csdn.net/pingnanlee/article/details/80940993

サーブレットTomcat8.5.31の例を達成するために、TomcatはServletContainerInitializerの実装クラスを取得し、簡単な言及が(org.apache.catalina.startup.ContextConfig.webConfigである)ステップ3のコールのprocessServletContainerInitializers、中()、

これは、JavaのJAR ServiceLoaderの変化として解釈独自のWebappServiceLoaderを、使用しています。

ちなみにTomcatはWebConfigの()呼び出しチェーンを開始すると:

Tomcat.start() - >各种代理的開始() - > org.apache.catalina.core.StandardContext.startInternal-> LifecycleBase.fireLifecycleEvent-> org.apache.catalina.startup.ContextConfig.lifecycleEvent-> configureStart-> WebConfig 

別の:Tomcatのソースコードについてため息、各方法は、ほぼ例外がそれと比較して、より直感的で表すことができる、それぞれが長所とで深さ、OK比較のばね源を有し、それはブール変数と呼ばれ、長さです。

 

@HandlesTypes実装原理:

最初に私は非常に混乱していた始まるすべてのノートの、彼の役割は、パラメータとしてonStartup(ServletContainerInitializer)メソッドに指定されたClassオブジェクトに注釈を付けることです。

しかし、このコメントが展開されるように、ユーザーに任され、彼はClassオブジェクトがServletContainerInitializerを継承する必要はありません指定されていない、と何も書かれたMETA-INF /サービス/ファイル(書き込むことはできません)、その後、Tomcatはスキャンを指定する方法でありますまだクラス。

答えは、ASM、バイトコード操作フレームワークと同様の効果で、Apache Software FoundationのJakartaプロジェクトの一部であるバイトコードエンジニアリングライブラリ(BCEL)、です。

WebConfigの()呼び出し注釈processServletContainerInitializers()クラス名に記録し、ステップ4、ステップ5にはprocessAnnotationsStreamこの方法、ClassParser BCELバイトコードレベルリード/ WEB-INF /クラスの使用であり、そしてクラスファイルのスーパークラス名と、彼らはorg.apache.catalina.util.Introspectionによって同じクラスであればノートが、同じクラスに記録されたかどうかを判断するために実装されたインタフェースの名前でいくつかのjar(フラグメントと呼ばれる概念で指定する必要があります) org.apache.catalina.core.StandardContext、つまり、実際のコールTomcatにステップ11のクラスオブジェクトのロード、そして最後に保存され、

ServletContainerInitializer.onStartup()の場所。

 

これまでのところ、謎は最終的に解決されました。

 

しかし、ほとんど疑いがあり、StandardContextでオブジェクト保存@HandlesTypesは>>>初期化子を?地図<ServletContainerInitializer、セット<クラス<呼ばれ、WebConfigのを除いて彼のaddServletContainerInitializer法()の外、ともTomcatEmbeddedServletContainerFactory.addJasperInitializer TomcatEmbeddedServletContainerFactory.configureContextコールませんアップを実行し、中で混合し、余分なクラスがあるかどうかを知っています。その中のプロセスSpringServletContainerInitializer.onstartで、このようなコメントの不思議スプリングの理由ません:D

  守備のして//:一部のサーブレットコンテナが、無効なクラスをご提供していない
  にかかわらず@HandlesTypesが言う// ...

私は他のサーブレットを知らない、そのような突堤エンジンとして、それがこのコメント@HandlesTypes、それを実現する方法です。

 

おすすめ

転載: www.cnblogs.com/feixuefubing/p/11593411.html