https://www.cnblogs.com/cxuanBlog/p/11179439.html
公式ウェブサイトの読み物
プロジェクトを作成する前に、SpringBootがSpringMVCに対してどのような構成を行ったか、拡張方法や方法などを知る必要があります。カスタマイズします。
これらが明確な場合にのみ、将来的にはより快適に使用できるようになります。パス1:ソースコード分析、パス2:公式ドキュメント
それを注意深く比較して、それがどのように実装されているかを見てみましょう。SpringBootがSpringMVCを自動的に構成したこと、そしてどのようなことが自動的に構成されたかを示しています。
ContentNegotiatingViewResolverコンテンツネゴシエーションビューリゾルバー
ViewResolverは自動的に構成されます。これは、以前に学習したSpringMVCのビューリゾルバーです。
つまり、メソッドの戻り値に従ってビューオブジェクト(View)が取得され、ビューオブジェクトがレンダリング方法(転送、リダイレクト)を決定します。
ここでソースコードを見てみましょう。WebMvcAutoConfigurationを見つけてから、ContentNegotiatingViewResolverを検索します。次の方法を見つけてください!
このカテゴリをクリックして確認できます。対応する解析ビューコードを見つけます。
引き続きクリックして、候補ビューをどのように取得したかを確認します。
getCandidateViewsで、彼がすべてのビューリゾルバーを取得し、whileループを実行して、それらを1つずつ解決したことを確認しました。
だから私は結論に達しました:ContentNegotiatingViewResolverこのビューリゾルバーはすべてのビューリゾルバーを組み合わせるために使用されます
彼の組み合わせロジックをもう一度調べて、属性viewResolversがあることを確認し、それがどこに割り当てられているかを確認しましょう。
コンテナ内でビューリゾルバを探しているので、ビューリゾルバを実装できると推測できますか?
ビューリゾルバーを自分でコンテナに追加できます。このクラスは、自動的にアセンブルするのに役立ちます。実装しましょう。
カスタムビューリゾルバー
1.私たちのメインプログラムでビューパーサを書くためにレッツ・トライ、
詳細情報
@Configuration注釈
パッケージcom.zhou.config;
@Bean注釈
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.View;
import org.springframework.web.servlet.ViewResolver;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import java.util.Locale;
//如果 ,你想 diy 一些定制化的功能,只要实现这个组件,然后将它交给springboot,springboot就会帮我们自动装配!
//扩展spring mvc ,dispatchServlet
@Configuration
public class MyMvcConfig implements WebMvcConfigurer {
//在一个方法上使用@Bean注解就表明这个方法需要交给Spring进行管理。
@Bean
public ViewResolver myViewResolver(){
return new MyViewResolver();
}
//public interface ViewResolver 实现了视图解析器接口的类,我们就可以把他看作视图解析器
//自定义一个自己的视图解析器MyViewResolver
public static class MyViewResolver implements ViewResolver{
@Override
public View resolveViewName(String s, Locale locale) throws Exception {
return null;
}
}
}
2.作成したビューパーサーが機能しているかどうかをどのように確認しますか?
すべてのリクエストはこのメソッドに送られるため、デバッグのためにDispatcherServletのdoDispatchメソッドにブレークポイントを追加しましょう。
3.プロジェクトを開始してから、ランダムにページにアクセスしてデバッグ情報を確認します。
私はこれを見つけた
ので、独自にカスタマイズしたものを使用したい場合は、このコンポーネントをコンテナに追加するだけで済みます!SpringBootが残りをやってくれます!
フォーマッターとコンバーター
フォーマットコンバーターを見つける:
@Bean
@Override
public FormattingConversionService mvcConversionService() {
// 拿到配置文件中的格式化规则
WebConversionService conversionService =
new WebConversionService(this.mvcProperties.getDateFormat());
addFormatters(conversionService);
return conversionService;
}
クリックして移動:
public String getDateFormat() {
return this.dateFormat;
}
/**
* Date format to use. For instance, `dd/MM/yyyy`. 默认的
*/
private String dateFormat;
プロパティファイルでわかるように、自動的に構成できます。
独自のフォーマット方法を構成すると、それが有効になるようにBeanに登録されます。構成ファイルで日付フォーマットルールを構成できます。
残りは1つずつ例ではなく、さらに学習することができます。
SpringBootのデフォルト構成を
非常に多くの自動構成に変更すると、原則は同じです。WebMVCの自動構成の原則の分析を通じて、ソースコードの調査を通じて学習方法を学び、結論を導き出す必要があります。この結論は、私たち自身のものであり、そしてパスベルデン。
SpringBootの最下層はこれらの設計の詳細を多く使用しているので、ソースコードをもっと読んでも大丈夫です!結論を得る;
SpringBootが多くのコンポーネントを自動的に構成する場合、最初にコンテナーにユーザー構成が存在するかどうかを確認し(ユーザーが@beanを構成する場合)、存在する場合はユーザー構成を使用し、存在しない場合は自動構成を使用します。
ビューリゾルバーなど、複数のコンポーネントが存在する可能性がある場合は、ユーザー構成をデフォルトの構成と組み合わせてください。
拡張機能の公式SpringMVCドキュメントは次のとおりです。
If you want to keep Spring Boot MVC features and you want to add additional MVC configuration
(interceptors, formatters, view controllers, and other features), you can add your own @Configuration
class of type WebMvcConfigurer but without @EnableWebMvc. If you wish to provide custom instances
of RequestMappingHandlerMapping, RequestMappingHandlerAdapter, or
ExceptionHandlerExceptionResolver, you can declare a WebMvcRegistrationsAdapter instance to
provide such components.
@Configurationアノテーションクラスを作成する必要があります。タイプはWebMvcConfigurerである必要があり、@ EnableWebMvcアノテーションはまだマークできません。自分で作成しましょう。configという新しいパッケージを作成し、クラスMyMvcConfigを作成します。
//应为类型要求为WebMvcConfigurer,所以我们实现其接口
//可以使用自定义类扩展MVC的功能
@Configuration
public class MyMvcConfig implements WebMvcConfigurer {
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/").setViewName("login");
registry.addViewController("/index.html").setViewName("login");
registry.addViewController("/main.html").setViewName("index");
}
}
ブラウザにアクセスしてみましょう
。ジャンプしました。したがって、SpringMVCを拡張したいので、SpringBootがすべての自動構成を保持することを保証するだけでなく、拡張構成を使用するためにも、この方法で使用することを公式に推奨しています。
原理を分析することができます:
1. WebMvcAutoConfigurationクラスを有するSpringMVC、自動コンフィギュレーションクラスであるWebMvcAutoConfigurationAdapter
2.このクラスにはアノテーションがあり、他の自動構成を行うときにインポートされます:@Import(EnableWebMvcConfiguration.class)
3. EnableWebMvcConfigurationクラスをクリックして見てみましょう。これは、親クラスDelegatingWebMvcConfigurationを継承します。
この親クラスには、次のようなコードがあります。
public class DelegatingWebMvcConfiguration extends WebMvcConfigurationSupport {
private final WebMvcConfigurerComposite configurers = new WebMvcConfigurerComposite();
// 从容器中获取所有的webmvcConfigurer
@Autowired(required = false)
public void setConfigurers(List<WebMvcConfigurer> configurers) {
if (!CollectionUtils.isEmpty(configurers)) {
this.configurers.addWebMvcConfigurers(configurers);
}
}
}
4.このクラスで参照として設定したviewControllerを探して、それが
protected void addViewControllers(ViewControllerRegistry registry) {
this.configurers.addViewControllers(registry);
}
5.クリックして見てみましょう
public void addViewControllers(ViewControllerRegistry registry) {
Iterator var2 = this.delegates.iterator();
while(var2.hasNext()) {
// 将所有的WebMvcConfigurer相关配置来一起调用!包括我们自己配置的和Spring给我们配置的
WebMvcConfigurer delegate = (WebMvcConfigurer)var2.next();
delegate.addViewControllers(registry);
}
}
そこで、私は結論に達しました。Spring独自の構成クラスだけでなく、すべてのWebMvcConfigurationが使用されますが、もちろん、独自の構成クラスも呼び出されます。
SpringMVCを完全に引き継ぐ
公式文書:
If you want to take complete control of Spring MVC
you can add your own @Configuration annotated with @EnableWebMvc.
完全な乗っ取りとは、SpringBootがSpringMVCを自動的に構成する必要がなく、すべて自分で構成することを意味します。
@EnableWebMvcを構成クラスに追加するだけです。
SpringMVCを全面的に引き継ぐかどうかを見てみましょう。SpringBootによって構成した静的リソースマッピングは間違いなく無効になります。テストできます。
コメントを追加する前に、ホームページにアクセスしてください
すべてのSpringMVC自動構成が失敗したことがわかりました!元の状態に戻ります。
もちろん、私たちの開発では、SpringMVCの完全な乗っ取りを使用することはお勧めしません
問題について考えていますか?コメントを追加したのに、自動構成が無効なのはなぜですか。ソースコードを見てみましょう:
1.ここで、クラスをインポートしたことがわかります。引き続き確認できます。
2.親クラスWebMvcConfigurationSupportを継承し
ます。3。Webmvc自動構成クラスを確認しましょう。
要約すると、@ EnableWebMvcはWebMvcConfigurationSupportコンポーネントをインポートしました。
インポートされたWebMvcConfigurationSupportは、SpringMVCの最も基本的な機能です。
SpringBootには多くの拡張構成がありますが、これを見る限り、もっと注意を払う必要があります〜