SpringBootのサーブレット、Filter、Listener構成


1.紹介
以前の記事で見るとSpringBootは多くの構成をカバーしているが、いくつかの構成はオリジナルのサーブレットで行うことが多いが、SpringBootではwebを構成する必要はない.xmlはパッケージ化されたjarパッケージの形式になる可能性があるので、この場合どう解決しますか?SpringBootは2つのソリューションを提供しています
2.クイックスタート
2.1方案一
方案一原生サーブレット3を採用する.0の注記を配置する、@WebService,@WebListener,@WebFilterはService 3である.0 apiで提供する注釈は、注釈によってwebに完全に代わることができる.xmlの構成は、次の簡単な構成です.
IndexServlet
    @WebServlet(name = "IndexServlet",urlPatterns = "/hello")
    public class IndexServlet extends HttpServlet {
            @Override
            public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
                    resp.getWriter().print("hello word");
                    resp.getWriter().flush();
                    resp.getWriter().close();
            }

            @Override
            protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
                    this.doGet(req, resp);
            }
    }

IndexListener
    @WebListener
    public class IndexListener implements ServletContextListener {
            private Log log = LogFactory.getLog(IndexListener.class);

            @Override
            public void contextInitialized(ServletContextEvent servletContextEvent) {
                    log.info("IndexListener contextInitialized");
            }

            @Override
            public void contextDestroyed(ServletContextEvent servletContextEvent) {

            }
    }

IndexFilter
    @WebFilter(urlPatterns = "/*", filterName = "indexFilter")
    public class IndexFilter implements Filter {
        Log log = LogFactory.getLog(IndexFilter.class);

        @Override
        public void init(FilterConfig filterConfig) throws ServletException {
            log.info("init IndexFilter");
        }

        @Override
        public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
            log.info("doFilter IndexFilter");
            filterChain.doFilter(servletRequest,servletResponse);

        }

        @Override
        public void destroy() {

        }
    }

上の構成が完了しました.コアの注記@サーブレットComponentScanを構成する必要があります.具体的な構成項目は以下の通りです.スキャンのパスを構成できます.
    @Target(ElementType.TYPE)
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    @Import(ServletComponentScanRegistrar.class)
    public @interface ServletComponentScan {

        @AliasFor("basePackages")
        String[] value() default {};

        @AliasFor("value")
        String[] basePackages() default {};

        Class>[] basePackageClasses() default {};

    }

注記を入り口に追加して起動すればいいです
    @SpringBootApplication
    @ServletComponentScan
    public class AppApplication {

        public static void main(String[] args) throws Exception {
            SpringApplication.run(AppApplication.class, args);
        }

    }

2.2方案二
シナリオ2は独自のSpringBootでbeanを構成する方式で構成されており、SpringBootでは3種類のBeanFilterRegistrationBean、サーブレットRegistrationBean、サーブレットListenerRegistrationBeanがそれぞれ原生のFilter、サーブレット、Listenerを構成することに対応しており、以下に提供する3つの構成とシナリオ1で採用する方式で統一的な効果が得られる
    @Bean
    public ServletRegistrationBean indexServletRegistration() {
        ServletRegistrationBean registration = new ServletRegistrationBean(new IndexServlet());
        registration.addUrlMappings("/hello");
        return registration;
    }

    @Bean
    public FilterRegistrationBean indexFilterRegistration() {
        FilterRegistrationBean registration = new FilterRegistrationBean(new IndexFilter());
        registration.addUrlPatterns("/");
        return registration;
    }
    @Bean
    public ServletListenerRegistrationBean servletListenerRegistrationBean(){
        ServletListenerRegistrationBean servletListenerRegistrationBean = new ServletListenerRegistrationBean();
        servletListenerRegistrationBean.setListener(new IndexListener());
        return servletListenerRegistrationBean;
    }

3.まとめ
両方式は使用に差があるが、内部SpringBootの実現においてはサーブレット3を使用するも差がない.0注記は、スキャン注記によってこの3つのbeanに変換されたFilterRegistrationBean、サーブレットRegistrationBean、サーブレットListenerRegistrationBean
4.拡張
実際にSpringBootはSpringMvcを使用している間にDispatcherServiceletを構成する必要はありません.自動構成されているので、初期構成パラメータを追加するには、次のようにします.
    @Bean
    public ServletRegistrationBean dispatcherRegistration(DispatcherServlet dispatcherServlet) {
        ServletRegistrationBean registration = new ServletRegistrationBean(dispatcherServlet);
        registration.addUrlMappings("*.do");
        registration.addUrlMappings("*.json");
        return registration;
    }

DispatcherServiceletを注入してから、サーブレットRegistrationBeanで動的に初期パラメータを追加することができます.
出典:https://blog.csdn.net/king_is_everyone/article/details/53116744