SpringBootスタディノート6-MVC構成の原則

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には多くの拡張構成がありますが、これを見る限り、もっと注意を払う必要があります〜

おすすめ

転載: blog.csdn.net/qq_44788518/article/details/114868564