Spring-web源码解析之Initializer2-SpringServletContainerInitializer

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
简介: 基于4.1.7.RELEASEServletContainerInitializer前面都是Spring内部WebApplicationInitializer的实现,下面来看一个Servlet包中ServletContainerInitializer的实现。

基于4.1.7.RELEASE

ServletContainerInitializer

前面都是Spring内部WebApplicationInitializer的实现,下面来看一个Servlet包中ServletContainerInitializer的实现。

首先看类申明

@HandlesTypes(WebApplicationInitializer.class)
public class SpringServletContainerInitializer implements ServletContainerInitializer

出现了一个@HandlesTypes的注解,这个注解的作用是指明在ServletContainerInitializer的实现类中其onStartup方法中所传进来的Class类型。

onStart的方法主要是创建WebApplicationInitializer并进行调用。

public void onStartup(Set<Class<?>> webAppInitializerClasses, ServletContext servletContext)
      throws ServletException {

   List<WebApplicationInitializer> initializers = new LinkedList<WebApplicationInitializer>();

   if (webAppInitializerClasses != null) {
      for (Class<?> waiClass : webAppInitializerClasses) {
         if (!waiClass.isInterface() && !Modifier.isAbstract(waiClass.getModifiers()) &&
               WebApplicationInitializer.class.isAssignableFrom(waiClass)) {
            try {
               initializers.add((WebApplicationInitializer) waiClass.newInstance());
            }catch (Throwable ex) {
            }
         }
      }
   }

   AnnotationAwareOrderComparator.sort(initializers);
   for (WebApplicationInitializer initializer : initializers) {
      initializer.onStartup(servletContext);
   }
}

在上面的代码中,首先进行了WebApplicationInitializer的实例化工作,为什么waiClass.newInstance()能够生效呢,是因为Servlet(3.0+)的容器在启动时扫描了所有@HandlesTypes指定的Class的实现类,然后封装在webAppInitializerClasses的Set里传递进来。

初始化完毕之后对所有的initializers进行了排序,如果initializer有@Order注解或者实现了Order接口,那么排序会依照Order指定的顺序完成。

排序之后则是调用了所有的initializer的onStartup方法,这些方法里或初始化DispatchServlet,或ConextLoaderListener,或Filter则根据各类不同的实现规则而定,由此可以看出Spring初始化的一些端倪。


目录
相关文章
|
22小时前
|
Java Spring
Spring底层架构源码解析(三)
Spring底层架构源码解析(三)
|
22小时前
|
XML Java 数据格式
Spring底层架构源码解析(二)
Spring底层架构源码解析(二)
|
1天前
|
算法 Java 程序员
Map - TreeSet & TreeMap 源码解析
Map - TreeSet & TreeMap 源码解析
7 0
|
1天前
|
缓存 Java 程序员
Map - LinkedHashSet&Map源码解析
Map - LinkedHashSet&Map源码解析
11 0
|
1天前
|
算法 Java 容器
Map - HashSet & HashMap 源码解析
Map - HashSet & HashMap 源码解析
9 0
|
5月前
|
XML Java uml
spring 源码解析——第一篇(ioc xml方式)
spring 源码解析——第一篇(ioc xml方式)
56 0
|
5月前
|
安全 Java 应用服务中间件
阿里技术官架构使用总结:Spring+MyBatis源码+Tomcat架构解析等
分享Java技术文以及学习经验也有一段时间了,实际上作为程序员,我们都清楚学习的重要性,毕竟时代在发展,互联网之下,稍有一些落后可能就会被淘汰掉,因此我们需要不断去审视自己,通过学习来让自己得到相应的提升。
|
5月前
|
Java 关系型数据库 数据库连接
Spring源码解析--深入Spring事务原理
本文将带领大家领略Spring事务的风采,Spring事务是我们在日常开发中经常会遇到的,也是各种大小面试中的高频题,希望通过本文,能让大家对Spring事务有个深入的了解,无论开发还是面试,都不会让Spring事务成为拦路虎。
77 1
|
12天前
|
Java Spring 容器
Spring IOC、AOP与事务管理底层原理及源码解析
【10月更文挑战第1天】Spring框架以其强大的控制反转(IOC)和面向切面编程(AOP)功能,成为Java企业级开发中的首选框架。本文将深入探讨Spring IOC和AOP的底层原理,并通过源码解析来揭示其实现机制。同时,我们还将探讨Spring事务管理的核心原理,并给出相应的源码示例。
50 9
|
1天前
|
XML Java 数据格式
手动开发-简单的Spring基于注解配置的程序--源码解析
手动开发-简单的Spring基于注解配置的程序--源码解析
4 0

推荐镜像

更多