zoukankan      html  css  js  c++  java
  • spring与Servlet的感情

    先来一段背景吧

    伴随着servlet3.0的引入 

    servlet也趋向与基于注解,纯java代码编程的方式

    在这里spring也很快的追随了这一特性,进行了跟进,

    使得之前的ApplicationContext需要通过xml配置,转而到纯java代码

    这里就有很多个注解,这里主要说明的是@Configuration @Bean  以及一些其他的Component注解

    注解有了,我们如何启动监听器来让我们的SpringContext启动呢servlet3.0都没有web.xml了,那么spring是如何弄得

    直接上代码 spring源码

    @HandlesTypes(WebApplicationInitializer.class)
    public class SpringServletContainerInitializer implements ServletContainerInitializer {
    
        @Override
        public void onStartup(Set<Class<?>> webAppInitializerClasses, ServletContext servletContext)
                throws ServletException {
    
            List<WebApplicationInitializer> initializers = new LinkedList<WebApplicationInitializer>();
    
            if (webAppInitializerClasses != null) {
                for (Class<?> waiClass : webAppInitializerClasses) {
                    // Be defensive: Some servlet containers provide us with invalid classes,
                    // no matter what @HandlesTypes says...
                    if (!waiClass.isInterface() && !Modifier.isAbstract(waiClass.getModifiers()) &&
                            WebApplicationInitializer.class.isAssignableFrom(waiClass)) {
                        try {
                            initializers.add((WebApplicationInitializer) waiClass.newInstance());
                        }
                        catch (Throwable ex) {
                            throw new ServletException("Failed to instantiate WebApplicationInitializer class", ex);
                        }
                    }
                }
            }
    
            if (initializers.isEmpty()) {
                servletContext.log("No Spring WebApplicationInitializer types detected on classpath");
                return;
            }
    
            servletContext.log(initializers.size() + " Spring WebApplicationInitializers detected on classpath");
            AnnotationAwareOrderComparator.sort(initializers);
            for (WebApplicationInitializer initializer : initializers) {
                initializer.onStartup(servletContext);
            }
        }
    
    }

    这里介绍下几个核心

    ServletContainerInitializer 

      servlet3.0提供的动态注册,这里有一个缺点就是只能初始化的时候注册

    SpringServletContainerInitializer 

      这里就是我们spring提供了,其实针对servlet3.0就是用户自定义

    WebApplicationInitializer

      这个类就是一个接口,和@HandlesType注解一起使用,这个接口可以被SpringServletContainerInitializer 进行处理,然后在onStart()方法中进行操作,因为这个注解提供的参数可以被这个方法所获取

    @HandlesTypes

      给SpringServletContainerInitializer 的onStart()方法提供入参

    这下大致就明白了

    也就是spring 对servlet 进行了自定义启动,在spring通过WebApplicationInitializer抽象出来的接口,然后由特殊功能的启动来进行实现,这样的话,在上下文中可以被onStart()进行启动

    这里展示几个常用的WebApplicationInitializer接口实现类

    AbstractContextLoaderInitializer

    AbstractDispatcherServletInitializer

    更进一步的

    AbstractAnnotationConfigDispatcherServletInitializer

    这里还有一个我所了解的 AbstractAnnotationConfigDispatcherServletInitializer

    反正大家可以多留意,意思就是,通过这些类,我们就可以去通过servletContext启动来对其增加一些servlet filter listener

    然后来启动我们的spring ApplicationContext

    启动Spring ApplicationContext 我们不多说了

    一个是监听器,一个是过滤器,美美的哈哈

  • 相关阅读:
    Payload Header到底是什么
    usb bulk传输和同步传输
    Video streaming interface 带宽的选择
    Methyl-SeqDNA的甲基化图谱|DNase I-Seq|ChIP-Seq|3C-Seq|
    连词词组|relax|brings about a rise in|Chance are (high)that|Have no clue|Be passionate about|Tedious|overwhelmed by piles of
    body书写总框架
    单个body|简单解释|复杂解释|反面解释
    TS写法
    saturates|meteoric|enclose|marooned|predators|Pioneer community|salinization|condenser|embodied
    否定事实信息题
  • 原文地址:https://www.cnblogs.com/obesityspace/p/6838316.html
Copyright © 2011-2022 走看看