zoukankan      html  css  js  c++  java
  • SpringBoot:Web原生组件注入

    注入方式

    Web原生组件指的是:Servlet、Filter、Listener

    注解注入

    @WebServlet(urlPatterns = "/myServlet")
    public class MyServlet extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            resp.getWriter().write("servlet");
        }
    }
    

    main方法加上@ServletComponentScan

    @ServletComponentScan
    @SpringBootApplication
    public class Boot2MyApplication {
        public static void main(String[] args) {
            SpringApplication.run(Boot2MyApplication.class, args);
        }
    }
    

    image-20210411141340382

    官方文档也是这样说明的:

    image-20210411141522245

    测试filter:

    @Slf4j
    @WebFilter(urlPatterns = "/myServlet")
    public class MyFilter implements Filter {
    
    
        @Override
        public void init(FilterConfig filterConfig) throws ServletException {
            log.info("init");
        }
    
        @Override
        public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
            log.info("MyFilter doFilter");
            chain.doFilter(request, response);
        }
    
        @Override
        public void destroy() {
            log.info("destroy");
        }
    }
    

    image-20210411141820799

    RegistrationBean方式

    官方文档上上面还写了一个方式:

    image-20210411142216464

    测试:先注释掉filter和servlet上面的注解

    编写配置类:

    @Configuration
    public class MyRegistryConfig {
    
        @Bean
        public ServletRegistrationBean<MyServlet> myServlet(){
            MyServlet myServlet = new MyServlet();
            return new ServletRegistrationBean<>(myServlet, "/myServlet");
        }
    
        @Bean
        public FilterRegistrationBean<MyFilter> myFilterFilterRegistrationBean(){
            MyFilter myFilter = new MyFilter();
            return new FilterRegistrationBean<>(myFilter,myServlet());
        }
    }
    

    测试,仍然成功。Listener与其类似,使用的是ServletListenerRegistrationBean注册,这里不再演示。

    DispatcherServlet注册原理

    进入DispatcherServletAutoConfiguration自动配置类:有一个内部类DispatcherServletConfiguration

    这里向容器中注入了一个DispatcherServlet,DispatcherServlet默认处理的请求路径是“/”

    image-20210411145835419

    后面又有一个DispatcherServletRegistrationConfiguration,向容器中注册了DispatcherServletRegistrationBean,并设置了DispatcherServlet

    image-20210411145944294

    DispatcherServletRegistrationBean是继承于ServletRegistrationBean

    image-20210411150057038

    在tomcat中,Servlet处理请求为精确优先处理原则。

    如果有两个servlet,AServlet可以处理"/",BServlet可以处理“/hello”,那么如果发送“/hello”请求,则为BServlet处理,因为BServlet比AServlet精确。

  • 相关阅读:
    服务器资源共享--IIS站点/虚拟目录中访问共享目录(UNC)
    sql reiserror 输出错误
    使用xib方式创建UITableViewCell,设置Label自动换行注意事项
    原生的UITableViewCell高度自适应,textLabel自动换行显示
    屏幕截取-2种模式
    NSDictionary初始化,使用@{}方法,插入nil时会报空指针异常
    Unicode解码、URL编码/解码
    解决UITableView数据没有充满屏幕时,显示多余的空白cell的问题
    UITableView的分割线不满屏的解决方法
    动态获取UIWebView的真正高度
  • 原文地址:https://www.cnblogs.com/wwjj4811/p/14643899.html
Copyright © 2011-2022 走看看