SpringMVCソース - 最後にコントローラハンドラは何ですか?

     いくつかの感触結論は間違っているが、いくつかの個人的な理解のような全体的な外観は、それを確認することです

      私は、物品の前には、常に心理的な混乱があるだろうと信じていました。それが何であるかを最終的には、コントローラハンドラ?まず、我々はそれがObjectオブジェクトであると判断することができます。第二に、それは春の豆をできるように、文字列型を可能にする、HandlerExecutionChain許可されています。最後にに何段階に応じていることは何です。

     次のようにソースが、getHandler AbstractHandlerMappingハンドラクラス()メソッドの最初の発生です。


  
  
  1.   公共 最終 HandlerExecutionChain getHandler (HttpServletRequestのリクエスト)が スロー例外 {
  2.         オブジェクト・ハンドラ= getHandlerInternal(リクエスト)。
  3.          もし (ハンドラ== NULL ){
  4.             行為= getDefaultHandler()。
  5.         }
  6.          もし (ハンドラ== NULL ){
  7.              リターン ヌル
  8.         }
  9.          //ビーン名または解決ハンドラ?
  10.          もし (ハンドラ instanceofの 文字列){
  11.             文字列れるhandlerName =(String)をハンドラ。
  12.             取引= getApplicationContext()getBean(商号)。
  13.         }
  14.          リターン getHandlerExecutionChain(ハンドラ、リクエスト)。
  15.     }

   我々getHandlerInternal()私たちはハンドラメソッドが欲しいものを手に入れます。それはすなわち、3を達成しました。

   次のように最初のクラスコードに実装AbstractHandlerMethodMapping。 


  
  
  1.   保護 HandlerMethod getHandlerInternal (HttpServletRequestのリクエスト)が スロー例外 {
  2.         //リクエストURLに応じて、ハンドラの検索パスを取得
  3.         ストリングlookupPath = getUrlPathHelper()getLookupPathForRequest(リクエスト)。
  4.         // HandlerMethodのパスハンドラを見つけます
  5.         HandlerMethod handlerMethod = lookupHandlerMethod(lookupPath、リクエスト)。
  6.          リターン (handlerMethod =! ヌル handlerMethod.createWithResolvedBean():? ヌル )。
  7.     }

   あなたは、戻り値はHandlerMethodタイプで見ることができます。あなたが読んでいませんか?それは私たちがクラスのコンストラクタHandlerMethodを見て、問題ではありません。


  
  
  1.   公共 HandlerMethod (オブジェクト・ビーン、メソッドmethod) {
  2.          この .bean =ビーン。
  3.          この .beanFactory = nullを
  4.          この .method =方法。
  5.          この .bridgedMethod = BridgeMethodResolver.findBridgedMethod(方法)
  6.          この .parameters = initMethodParameters()。
  7.     }

   ヘクタールああ?だから、HandlerMethodはハンドラがリクエストメソッド自体とBeanオブジェクトが含まれています!つまり、ここではいわゆるハンドラは、私たちが要求されたコントローラとメソッドのアプローチが含まれているクラスのオブジェクトを参照します。だから、パスを言います。不思議のDispatcherServletクラスアダプタは、私たちのコントローラー層のメソッドを呼び出すために使用することはできません!

我々はhandlerMethod.createWithResolvedBean()メソッドは、コードの上に、Geshaで見て:


  
  
  1. 公共 HandlerMethod createWithResolvedBean () {
  2.         オブジェクトハンドラ= この .bean;
  3.          もし この .bean instanceofの {String)を
  4.             ストリングのbeanName =(文字列) この .bean;
  5.             ハンドラ= この .beanFactory.getBean(のbeanName)。
  6.         }
  7.          リターン 新しい HandlerMethod( これ は、ハンドラ);
  8.     }


   使い慣れたなじみのありませんか?驚きは驚きませんか?あなたがコードと、ここのコードでAbstractHandlerMappingクラスgetHandler()メソッドを比較することができ、Bean名は、対応するBeanオブジェクトを取得するように、1つの文字列のハンドラを入力するのと同じことをしました。

 次のように最初のクラスコードに実装AbstractURLHandlerMapping。


  
  
  1. 保護されたオブジェクトgetHandlerInternal (HttpServletRequestのリクエスト)が スロー例外 {
  2.         ストリングlookupPath = getUrlPathHelper()getLookupPathForRequest(リクエスト)。
  3.         オブジェクトハンドラ= lookupHandler(lookupPath、リクエスト)。
  4.          リターン・ ハンドラ;
  5. }
  6. 保護されたオブジェクトlookupHandler (文字列URLパス、HttpServletRequestのリクエスト)が スロー例外 {
  7.          //直接一致していますか?
  8.         オブジェクトハンドラ= この .handlerMap.get(URLパス);
  9.          もし (ハンドラ!= nullの ){
  10.              //ビーン名または解決ハンドラ?
  11.              もし (ハンドラ instanceofの 文字列){
  12.                 文字列れるhandlerName =(String)をハンドラ。
  13.                 取引= getApplicationContext()getBean(商号)。
  14.             }
  15.             validateHandler(ハンドラ、リクエスト)。
  16.              リターン buildPathExposingHandler(ハンドラ、URLパス、URLパス、 ヌル );
  17.         }
  18.  }
  19.  

  前回の記事では、ハンドラがされて登録され、このことに言及したhandlerMap

  this.handlerMap.put(urlPath, resolvedHandler);
  
  

  ここでは、それは終わりました。注最後の呼び出しbuildPathExposingHandler()メソッドつまり、以下のように、コードは次のとおりです。 


  
  
  1. 保護されたオブジェクトbuildPathExposingHandler (オブジェクトrawHandler、文字列bestMatchingPattern、
  2.             文字列pathWithinMapping、地図<文字列、文字列> uriTemplateVariables) {
  3.         HandlerExecutionChainチェーン= 新しい HandlerExecutionChain(rawHandler)。
  4.         chain.addInterceptor( 新しい PathExposingHandlerInterceptor(bestMatchingPattern、pathWithinMapping));
  5.          もし (!CollectionUtils.isEmpty(uriTemplateVariables)){
  6.             chain.addInterceptor( 新しい UriTemplateVariablesHandlerInterceptor(uriTemplateVariables));
  7.         }
  8.          リターン・ チェーン。
  9. }

見て、そして最後にHandlerExecutionChainハンドラの型を返すことができます。

 次のように最初のクラスコードに実装EmptyHandlerMapping。


  
  
  1. 保護されたオブジェクトgetHandlerInternal (HttpServletRequestのリクエスト)が スロー例外 {
  2.              リターン ヌル
  3.  }

この場合、戻り値は空なので、デフォルトのハンドラを直接使用します。

 

    そこで問題は、それが最終的にどのようなハンドラですか?これは、コントローラ自体に豆や包装の要求方法でした。ハンドラはHandlerExecutionChain二次包装、インターセプタチェーン一緒に関連付けられているハンドラです。その後、DispatcherServlertをフィルタリングするためのハンドラチェーン内のインターセプタの完了。

   追加:不思議なぜこれほど長いマーク@Controllerコントローラクラスのノートとして、それに役割を再生する方法であるSpringMVC要求処理クラスとして使用することができてきましたか?これは@Controllerノートが@Componentノートを継承しているため、彼らは@Controller注釈クラスがスキャンされ、春のコンテナ船に登録されますマークされていたです。本当の違いは、この重要なコードの下にあるとおり:

        (文字列のinstanceof this.bean)なら、{
            文字列のbeanName =(文字列)this.bean。
            ハンドラ= this.beanFactory.getBean(のbeanName)。
        }

                        <li class="tool-item tool-active is-like "><a href="javascript:;"><svg class="icon" aria-hidden="true">
                            <use xlink:href="#csdnc-thumbsup"></use>
                        </svg><span class="name">点赞</span>
                        <span class="count">2</span>
                        </a></li>
                        <li class="tool-item tool-active is-collection "><a href="javascript:;" data-report-click="{&quot;mod&quot;:&quot;popu_824&quot;}"><svg class="icon" aria-hidden="true">
                            <use xlink:href="#icon-csdnc-Collection-G"></use>
                        </svg><span class="name">收藏</span></a></li>
                        <li class="tool-item tool-active is-share"><a href="javascript:;"><svg class="icon" aria-hidden="true">
                            <use xlink:href="#icon-csdnc-fenxiang"></use>
                        </svg>分享</a></li>
                        <!--打赏开始-->
                                                <!--打赏结束-->
                                                <li class="tool-item tool-more">
                            <a>
                            <svg t="1575545411852" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5717" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M179.176 499.222m-113.245 0a113.245 113.245 0 1 0 226.49 0 113.245 113.245 0 1 0-226.49 0Z" p-id="5718"></path><path d="M509.684 499.222m-113.245 0a113.245 113.245 0 1 0 226.49 0 113.245 113.245 0 1 0-226.49 0Z" p-id="5719"></path><path d="M846.175 499.222m-113.245 0a113.245 113.245 0 1 0 226.49 0 113.245 113.245 0 1 0-226.49 0Z" p-id="5720"></path></svg>
                            </a>
                            <ul class="more-box">
                                <li class="item"><a class="article-report">文章举报</a></li>
                            </ul>
                        </li>
                                            </ul>
                </div>
                            </div>
            <div class="person-messagebox">
                <div class="left-message"><a href="https://blog.csdn.net/qq_28802119">
                    <img src="https://profile.csdnimg.cn/0/9/0/3_qq_28802119" class="avatar_pic" username="qq_28802119">
                                            <img src="https://g.csdnimg.cn/static/user-reg-year/2x/5.png" class="user-years">
                                    </a></div>
                <div class="middle-message">
                                        <div class="title"><span class="tit"><a href="https://blog.csdn.net/qq_28802119" data-report-click="{&quot;mod&quot;:&quot;popu_379&quot;}" target="_blank">小雨的光</a></span>
                                            </div>
                    <div class="text"><span>发布了119 篇原创文章</span> · <span>获赞 22</span> · <span>访问量 2万+</span></div>
                </div>
                                <div class="right-message">
                                            <a href="https://im.csdn.net/im/main.html?userName=qq_28802119" target="_blank" class="btn btn-sm btn-red-hollow bt-button personal-letter">私信
                        </a>
                                                            <a class="btn btn-sm  bt-button personal-watch" data-report-click="{&quot;mod&quot;:&quot;popu_379&quot;}">关注</a>
                                    </div>
                            </div>
                    </div>
    
发布了45 篇原创文章 · 获赞 0 · 访问量 3547

     有些结论感觉是错的 整体看看就好 不过有些是对的 看个人理解吧

      相信看了前边的文章,心理总是会有一些困惑。控制器Handler到底是个什么呢?首先我们可以确定的是它是一个Object对象。其次,它允许是String类型,允许是Spring Bean,允许是HandlerExecutionChain。到底是什么,取决于处于哪个阶段。

おすすめ

転載: blog.csdn.net/qq_44813090/article/details/104178512