AbstractDetectingurllermappingは、スキャンを介してハンドラーをレジスタし、リクエストを受信するときにAbstracturllhandLermappingのGethandlerintenternalによって配布されます。
5つのサブクラスと1つの抽象クラスがあります。
SimpleurlhandLermappingと同様に、initapplicationContextを上書きしてからDetectHandlersを呼び出すことにより初期化されます。
検出ハンドラーは、beanfactututilsを介してアプリケーションオブジェクトをスキャンし、サブクラスのsiveineurlsforhandlerを予約して、ハンドラーに従って対応するURLを生成します。
登録済みのレジスターハンドラーは、引き続きAbstracturllhandLermappによって提供されています。
// abstractDetectingurlhandLermapping/****superclassの初期化に加えて、{@link #detecthandlers()}メソッドを呼び出します。これは、abstracthandlermappingのinitapplicationContext初期化インターセプターとも呼ばれます。
主人公が表示され、ハンドラーを検出し、ハンドラーをスキャンします
// abstractDetectingurlhandLermapping/***現在のAppootsContextにあるすべてのハンドラーを登録します。そのようなURLを決定できない*の豆は、単にハンドラーとは見なされません。* @throws org.springframework.beans.beansexcepthand @see #determineurlsforhandler(string)*/保護されたvoid detecthandlers {)beansexception {) {logger.debug( "アプリケーションコンテキストでURLマッピングを探しています:" + getApplicationContext();} string [] beannames =(the.tectectecthandlersinanceStorcontexts?beanfactutils.beannamesputyptypeincludedanceStors(getApplicationContext()、Object.class)) :getApplicationContext()。getBeanNamesFortype(Object.Class)); if(!objectutils.isempty(urls)){// urlパスが見つかった:handler.registerhandler(urls、beanname)と考えてみましょう。ここで予約されているテンプレートメソッドは、次のように定義されています。
/***指定されたハンドラーBeanのURLを決定します。 BeannameurlhandLermappingおよびAbstractControllurrurlhandLermappingのテンプレートメソッドの実装を見てみましょう。 beannameurlhandlermappingは非常にシンプルなので、sefientineurlsforhandlerを実装します。そのエイリアスは、beanname.// beannameurlhandlermapping/*** urlの特定のビーンの名前とエイリアスをbeanname.// beannameurlhandlermappingを介して構成ファイルで構成する必要があります。 (beanname.startswith( "/")){urls.add(beanname);} string [] aliases = getApplicationContext()。getAliase(beanName); for(string alias:aliass){if(alias.startswith( "/")){urls.add(alias);}} return stringutils.tostringarray(urls);} AbstractControllerurllhandLermappingの実装を見てみましょう
ISELIFIBLEFORPAPPINGは、コントローラーが除外されるかどうかを決定します(パッケージパッケージまたはクラスクラスから除外)。
BuildurlsForhandlerは、サブクラスから特定のURL生成ルールを実装します
iSControllerTypeは、コントローラーのサブクラスかどうかを決定します
BuildurlsForhandlerは、サブクラスの生産URLのテンプレートメソッドを予約します。
// AbstractControllerurlhandLermapping/***この実装は{@link #buildurlsforhandler}に代表されます。 getApplicationContext()。getType(beanname); if(isecibleformapping(beanname、beanclass)){return buildurllsforhandler(beanname、beanclass);}コントローラーbeanの名前* @param beanclassコントローラーbeanのコンクリートクラス* @return指定されたクラスが除外されているかどうか* @see#setexcludedclasses*/保護されたブールイソリージブルフォーピング(弦楽器、クラスbeanclass) {logger.debug( "controller bean '" + beanname + "' '' from class name name mapping" + "からbeanタイプを決定できなかったため、");} if(this.excludedclasses.contains.(beanclass)){if(logger.isdebugenabled()) + "'' from class name mapping" + "beanクラスが明示的に除外されているため:" + beanclass.getName());} return false;} string beanclassname = beanclass.getName(); (logger.isdebugenabled()){logger.debug( "explude controller bean '" + beanname + "' from class name mapping" + "beanクラスは除外されたパッケージで定義されているため、" + beanclass.getName();} return false;} AbstractControllerUrlHandlerMapping/*** Determine whether the given bean class indicates a controller type* that is supported by this mapping strategy.* @param beanClass the class to introspect*/protected boolean isControllerType(Class beanClass) {return this.predicate.isControllerType(beanClass);} // ControllerTypePredicate provides 2 APIs to determine whether itコントローラーのサブクラスまたはマルチアクションコントローラーのサブクラスです。/***コントローラータイプを識別する内部ヘルパークラス。 isMultiactionControllertype(class beanclass){return multiactioncontroller.class.isassignablefrom(beanclass);}}} URLを生成するためにテンプレートメソッドを予約します
// abstractControllerurrurlhandLermapping/***サブクラスによって実装される要約テンプレートメソッド
抽象的なコントロールの2つの実装ControllBeanNameurlhandlermappingとControllClassnameurlhandLermappingを見てみましょう。
実際、これら2つは非常に簡単です。 1つはBeanNameに基づいてURLを生成することであり、もう1つはClassNameに基づいてURLを生成することです。
// ControllBeanNameurlhandLermapping@OverrideTrutected String [] BuildurlsForHandler(String BeanName、class BeanClass){list <string> urls = new ArrayList <String>(); urls.Add(GeneratePathmapping(BeanName)); String [] getApplicationContext(BeanName); for(string alias:aliass){urls.add(generatepathmapping(alias));} return stringutils.tostringarray(urls);} // controllbeannameurlhandlermapping/**必要に応じて '/'を追加し、URLのサフィックスを名前に付属します。 (beanname.startswith( "/")?beanname: "/" + beanname); stringbuilder path = new stringbuilder(); if(!name.startswith(this.urlprefix)){path.append(this.urlprefix);} path.path(name); if(! {path.append(this.urlsuffix);} return path.toString();} // controllerclassnameurlhandlermapping Pathmappingsの実装を生成するために直接委任します
@OverRideProtected String [] BuildUrlsForHandler(String BeanName、class BeanClass){return generatepathmappings(beanclass);} // controllerclassnameurlhandlermapping BuildPathPrefixを介してパスのプレフィックスを取得します
BookController(パッケージ名なし)などのClassUtilsを介してClassNameを取得し、CGLIBプロキシを使用して問題を一緒に解決します。
ケースが敏感であるかどうかに応じてclassNameを変換します(デフォルトCaseSensitive = false;)
IsMultiCactionControllerTypeは、コントローラーがマルチアクションコントローラーのサブクラスであるかどうか、つまりコントローラーに複数のハンドラーが含まれているかどうかを決定します。
/***指定されたコントローラークラスの実際のURLパスを生成します。* <p>サブクラスは、この方法をオーバーライドすることにより生成されるパスをカスタマイズすることを選択できます。 BuildPathPrefix(beanClass); string className = classutils.getShortName(beanClass); string path =(classname.endswith(controller_suffix)?classname.substring(、classname.lastindexof(controller_suffix):classname); {pathmappend.append(path.substring(、).tolowercase())。append(path.substring());} else {path.tolowercase());}} if(ismultiactioncontrollertype(beanclass)) "/*"};} else {return new String [] {pathmapping.tostring() + "*"};}} // controllerclassnameurlhandlermapping/***指定されたコントローラークラスのパスプレフィックスを構築します。 StringBuilder BuildPathPrefix(class BeanClass){StringBuilder Pathmapping = new StringBuilder(); if(this.pathprefix!= null){pathmapping.append(this.pathprefix); pathmapping.append( "/");} reth {pathmappend.append( "/"/"/"/"/"/"/"); packageName = classutils.getPackageName(BeanClass); if(packagename.startswith(this.basepackage)){string subpackage = packagename.substring(this.basepackage.length())。サブパッケージ:subpackage.tolowercase()); pathmapping.append( "/");}} pathmapping;} // abstractcontrollerurlhandlermapping Predicate.ismultiactionControllerType固有の実装上記のControllerTypepredicateを参照してください
/***与えられたBeanクラスが複数のアクションメソッドにディスパッチするコントローラータイプ*を示すかどうかを判断します。
上記は、編集者が紹介したHandlermapp -AbstractDetectingurlhandLermappingシリーズのSpringMVCソースコード解釈の初期化に関する関連する知識です。私はそれが誰にでも役立つことを願っています!