Spring Boot 2.0学習ノート:(七)Spring Boot廃棄WebMvcConfigrer Adapter

13080 ワード

我々は、Spring BootプログラムがWebモジュールを導入した後、Spring Mvcに関する一連の構成が自動的に行われることを知っています.その自動構成は、org.springframe ork.boot.aconfigre.web.servlet.WebMvcAutoConfigrationです.
このクラスでは、Spring Bootは、ビュー解像度、スタティックリソース、メッセージ変換器、エリア情報解析器、トップページ、歓迎ページなどを構成してくれます.
ここではWebMvcAutoConfigrationという種類を分析していません.これはWebMvcConfigrer Adapterという適応類です.
Spring BootはSpring MVCの配置だけでなく、便利に拡張するために、私達に提供してくれました.
WebMvcConfigrer Adapterというアダプティブは、私たち自身がこのクラスを実現するだけで、ビュー解像器、エリア情報解析器などのコンポーネントをカスタマイズできる.
Spring Boot 2.0バージョンでは、WebMvcConfigreer Adapterという種類が破棄されました.
@Deprecated
public abstract class WebMvcConfigurerAdapter implements WebMvcConfigurer {
どうやってMVCの配置を拡張しますか?
1.WebMvcConfigrationSupportを継承する
WebMvcConfigrationSupportをよく見ると、多くのaddがあります.
/**
* Override this method to add Spring MVC interceptors for
* pre- and post-processing of controller invocation.
* @see InterceptorRegistry
 */
protected void addInterceptors(InterceptorRegistry registry) {
}

/**
 * Override this method to add view controllers.
 * @see ViewControllerRegistry
*/
protected void addViewControllers(ViewControllerRegistry registry) {
}

......
WebMvcConfigrationSupportを継承すると、これらのadd...メソッドを使用してユーザー定義のスクリーンセーバを追加したり、解像度を図ったりすることができます.以下のとおりです
@Configuration
public class NativeMvcConfig extends WebMvcConfigurationSupport {

    @Override
    protected void addViewControllers(ViewControllerRegistry registry) {
        registry.addViewController("/").setViewName("login");
        registry.addViewController("/login.html").setViewName("login");
    }
}

ここで問題があります.WebMvcConfigrationSupportを引き継いで容器に登録した後、Spring BootはMVCの自動配置に関しては有効ではありません.
Spring Boot起動WebMVC自動配置の条件を見てもいいです.
@Configuration
@ConditionalOnWebApplication(type = Type.SERVLET)
@ConditionalOnClass({ Servlet.class, DispatcherServlet.class, WebMvcConfigurer.class })
@ConditionalOnMissingBean(WebMvcConfigurationSupport.class)
@AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE + 10)
@AutoConfigureAfter({ DispatcherServletAutoConfiguration.class,
		ValidationAutoConfiguration.class })
public class WebMvcAutoConfiguration {
一つの条件は**@Comptional OnMissingBean*、コンテナの中にWebMvcConfigrationSupport.classがない場合にのみ自動配置が開始されます.
したがって、私たちはWebMvcConfigrationSupportを継承した後、あなた自身がコードに対してコントロールするのがかなり良い場合を除いて、継承クラスの中でWebMVCに関する一連の構成を書き換えました.そうでなければ、静的な資源にアクセスできないかもしれません.リターンデータはこれらの一連の問題に成功しません.
2.WebMvcConfigrerインターフェースを実現する.
Spring Boot 2.0はJava 8に基づいていますが、Java 8に大きな変化があります.インターフェースにdefault方法があります.default方法は強制的に実現する必要がありません.上記のWebMvcConfigrer Adapter類はWebMvcConfigrerというインターフェースを実現していますので、WebMvcConfigrer Adapter類を受け継ぐ必要はありません.WebMvcConfigurインターフェースを直接実現できます.例えば:
@Configuration
public class WebMVCConfig implements WebMvcConfigurer {

    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addViewController("/").setViewName("login");
        registry.addViewController("/login.html").setViewName("login");
    }

    @Bean
    public LocaleResolver localeResolver(){
        return new NativeLocaleResolver();
    }

    protected static class NativeLocaleResolver implements LocaleResolver{

        @Override
        public Locale resolveLocale(HttpServletRequest request) {
            String language = request.getParameter("language");
            Locale locale = Locale.getDefault();
            if(!StringUtils.isEmpty(language)){
                String[] split = language.split("_");
                locale = new Locale(split[0],split[1]);
            }
            return locale;
        }

        @Override
        public void setLocale(HttpServletRequest request, HttpServletResponse response, Locale locale) {

        }
    }
}
この2つの方法はいずれもWebMVCの拡張として設定をカスタマイズすることができます.違いは、WebMvcConfigrationSupportを継承することにより、WebMVCの自動配置が無効になり、自分ですべてのWebMVCに関する配置を実現する必要があり、WebMvcConfigrerインターフェースを実現すると、Spring Bootの自動配置が無効になりません.