Spring源码分析【3】-SpingWebInitializer的加载
SpingWebInitializer的加载
Spring基于注解的配置代码:
public class SpingWebInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {@Overrideprotected Class<?>[] getRootConfigClasses() {return new Class<?>[]{RootConfig.class};}@Overrideprotected Class<?>[] getServletConfigClasses() {return new Class<?>[]{WebConfig.class};}@Overrideprotected String[] getServletMappings() {return new String[]{"/"};}
}
整体调用UML图:
SpringServletContainerInitializer.onStartup传入参数:
类型判断必须是继承WebApplicationInitializer接口:
isAssignableFrom 是用来判断一个类Class1和另一个类Class2是否相同或是另一个类的超类或接口。
通常调用格式是
Class1.isAssignableFrom (Class2)
调用者和参数都是 java.lang.Class 类型。
而 instanceof 是用来判断一个对象实例是否是一个类或接口的或其子类子接口的实例。
格式是: oo instanceof TypeName
第一个参数是对象实例名,第二个参数是具体的类名或接口名
参考:Class.isAssignableFrom与 instanceof 区别
List<WebApplicationInitializer> initializers:
onStartup()调用链:
AbstractDispatcherServletInitializer 有onStartup()
->AbstractAnnotationConfigDispatcherServletInitializer 无onStartup()
->SpingWebInitializer 无onStartup()
调用父类的AbstractContextLoaderInitializer的onStartup()
调用createRootApplicationContext()
createRootApplicationContext()调用链:
AbstractAnnotationConfigDispatcherServletInitializer有createRootApplicationContext()
->AbstractDispatcherServletInitializer无createRootApplicationContext()
->AbstractContextLoaderInitializer调用createRootApplicationContext()
继承的调用链是逐级往下逐级往上
终于调用到getRootConfigClasses()开始第一阶段
register就是往set集合增加类
public void register(Class<?>... annotatedClasses) {Assert.notEmpty(annotatedClasses, "At least one annotated class must be specified");this.annotatedClasses.addAll(Arrays.asList(annotatedClasses));}
回到registerContextLoaderListener
ContextLoaderListener
ContextLoader
返回ContextLoaderListener
调用tomcat的ApplicationContextFacade implements ServletContext 调用addListener
调用addListener
addApplicationLifecycleListener
applicationLifecycleListenersObjects
newListeners
回到registerContextLoaderListener
完成onStartup
进入registerDispatcherServlet
调用createServletApplicationContext
开始第二阶段进入SpingWebInitializer的getServletConfigClasses
register同第一阶段
回到registerDispatcherServlet
进入tomcat的ApplicationContextFacade addServlet
addServlet
addChild
super.addChild
addChildInternal
children
回到registerDispatcherServlet
第三次进入SpingWebInitializer
回到registerDispatcherServlet
回到onStartup
回到onStartup
退出到Tomcat的StandardContext的startInternal()
entry.getKey()
initializers
相关文章:
PyTorch 1.5发布,与AWS联手推出TorchServe
导读:近日 PyTorch 发布了 1.5 版本的更新,作为越来越受欢迎的机器学习框架,PyTorch 本次也带来了大的功能升级。此外, Facebook 和 AWS 还合作推出了两个重要的 PyTorch 库。作者 | 神经星星来源 | HyperAI超神经(ID:…

更改时区,时间
整更改ubuntu时区,时间,localePublished by 笨二十一 at 11:56 上午 under Linux/Unix,服务器更改时区,时间执行tzselect按照提示进行选择时区sudo cp /usr/share/zoneinfo/Asia/ShangHai /etc/localtime执行sudo ntpdate cn.pool.ntp.orgcn.pool.ntp.org是位于中国…
throttle与debounce的区别
前几天看到一篇文章,我的公众号里也分享了《一次发现underscore源码bug的经历以及对学术界拿来主义的思考》具体文章详见,微信公众号:文中讲了大家对throttle和debounce存在误解,同时提到了《高程3》中实现节流方法存在一些问题&a…
Spring源码分析【0】-框架的基础:继承和接口调用链
Spring源码大量的使用继承和接口调用,现举个例子,不搞清楚这个无法看代码。 public class A extends B{public void f1() {System.out.println("f1 in a");} }public abstract class B extends C {protected abstract void f1();protected Str…
华人计算机视觉科学家黄煦涛逝世,众多AI大牛发文缅怀
当地时间2020年4月25日,华人计算机科学家黄煦涛教授在美国印第安纳州逝世,享年84岁。黄煦涛教授主要从事教学与图像处理、模式识别、计算机视觉和人机交互等方面的研究工作,一生出版了 14 本书,发表了 400 多篇学术论文。在学术研…

七年之痒,再见理想
不确定“再见理想”是“再见了,理想”还是“再次燃起理想”,稀里糊涂地对这句话有感觉。作为程序员,总会有自己的技术价值观和技术理想。工作七年多,开始痒了。 程序员的生活总是喜忧参半,出入体面的写字楼,…

HTML5学习笔记二 HTML基础
一、HTML 标题 HTML 标题(Heading)是通过<h1> - <h6> 标签来定义的. <h1>标题一</h1> <h2>标题二</h2> <h3>标题三</h3> 二、HTML 段落 HTML 段落是通过标签 <p> 来定义的. <p>亲吻你的手还…
程序员感叹一年只能存下15万太少了……网友:潸然泪下
最近有程序员网友晒出自己的年终奖,税后高达15.7万!看到这个情形,很多网友表示自己“被打鸡血了”。他强调学习的重要性,学习仍然是在这个时代下,普通人能够逆袭,给家人更好生活的一把利器!今天…
Spring源码分析【2】-Tomcat和Sping的连接点
Tomcat是怎么调用上Spring的呢?需要找到这个连接点。 答案就在org.apache.catalina.startup.ContextConfig的processServletContainerInitializers方法 new WebappServiceLoader() 回到processServletContainerInitializers 进入org.apache.catalina.startup.Weba…

优化数据库的方法及SQL语句优化的原则
优化数据库的方法: 1、关键字段建立索引。 2、使用存储过程,它使SQL变得更加灵活和高效。 3、备份数据库和清除垃圾数据。 4、SQL语句语法的优化。(可以用Sybase的SQL Expert,可惜我没找到unexpired的序列号) 5、清理删…

各大浏览器 CSS3 和 HTML5 兼容速查表
2019独角兽企业重金招聘Python工程师标准>>> 不知不觉中,支持 CSS3 和 HTML5 的浏览器变得越来越多,甚至包括最新版的 IE,当然,所谓支持仅仅是部分支持,因为 CSS3 和 HTML5 的W3C 规范都尚未形成。如果你现…
Spring源码分析【1】-Tomcat的初始化
org.apache.catalina.startup.ContextConfig.configureStart() org.apache.catalina.startup.ContextConfig.webConfig() 进入org.apache.catalina.startup.ContextConfig.processServletContainerInitializers processServletContainerInitializers参考:Spring源…
360金融首席科学家张家兴:只靠AI Lab做不好AI中台 | 独家专访
「AI 技术生态论」 人物访谈栏目是 CSDN 发起的百万人学 AI 倡议下的重要组成部分。通过对 AI 生态顶级大咖、创业者、行业 KOL 的访谈,反映其对于行业的思考、未来趋势判断、技术实践,以及成长经历。 本文为 「AI 技术生态论」系列访谈第21期࿰…

Delphi 正则表达式语法(3): 匹配范围
// [A-Z]: 匹配所有大写字母var reg: TPerlRegEx; begin reg : TPerlRegEx.Create(nil); reg.Subject : CodeGear Delphi 2007 for Win32; reg.RegEx : [A-Z]; reg.Replacement : ◆; reg.ReplaceAll; ShowMessage(reg.Subject); //返回: ◆ode◆ear ◆elphi 200…

基础算法整理(1)——递归与递推
程序调用自身的编程技巧称为递归( recursion)。递归做为一种算法在程序设计语言中广泛应用。 一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解&…

php正则表达式函数 preg_replace用法
preg_replace (PHP 3> 3.0.9, PHP 4 ) preg_replace -- 执行正则表达式的搜索和替换说明 mixedpreg_replace( mixed pattern, mixed replacement, mixed subject [, int limit])在 subject 中搜索 pattern 模式的匹配项并替换为 replacement。如果指定了 limit,则…
面试官吐槽:“Python程序员就是不行!”网友:我能把你面哭!
最近几年,Python莫名火了起来,很多公司都想赶上这“莫名”的热潮,招聘到大牛人才。但是,最近一个HR在社交网站的吐槽又火了:那么问题来了,市面上为什么鲜有企业满意的优秀的Python程序员?企业到…
Spring源码分析【5】-Spring MVC处理流程
org.apache.catalina.core.ApplicationFilterChain.doFilter 获取Filter org.apache.catalina.core.ApplicationFilterChain.internalDoFilter org.springframework.web.filter.DelegatingFilterProxy.doFilter invokeDelegate org.springframework.security.web.FilterCha…

Mysql——外键
2019独角兽企业重金招聘Python工程师标准>>> 一,外键 外键:foreign key,(外边的键,键不在本表中):如果一张表中有一个字段(非主键)指向另一张表的主键&#x…
揭开「拓扑排序」的神秘面纱
作者 | 小齐本齐责编 | Carol来源 | 码农田小齐Topological sort 又称 Topological order,这个名字有点迷惑性,因为拓扑排序并不是一个纯粹的排序算法,它只是针对某一类图,找到一个可以执行的线性顺序。这个算法听起来高大上&…
Spring源码分析【6】-ThreadLocal的使用和源码分析
Spring代码使用到了ThreadLocal java.lang.ThreadLocal.set getMap java.lang.Thread.threadLocals定义 回到set 如果map为null 则createMap

《软件的破解》
本人根据自己的经验简单给大家谈一谈。这些问题对于初学者来说常常是很需要搞明白的,根据我自己的学习经历,如果你直接照着很多破解教程去学习的话,多半都会把自己搞得满头的雾水,因为有很多的概念要么自己不是很清楚,…

php级别鉴定
一、PHP初级程序员薪资水平:4000.00--8000.00(RMB/月)~HTML设计与应用~DIVCSS~PHP基础~MySQL基础~PHP高级~CMS系统二、PHP中级程序员 薪资水平:8000.00--12000.00(RMB/月)~PHP面向对象~MySQL高级~Smarty模板…
Spring源码分析【7】-Spring 模板页和JSP文件的编译
org.apache.jasper.servlet.JspServletWrapper.service org.apache.jasper.JspCompilationContext.compile org.apache.jasper.JspCompilationContext.createCompiler org.apache.jasper.compiler.Compiler.isOutDated 判断文件是否存在 ..\Apache\apache-tomcat-8.0.36\w…

Distinction Between Strategy and Decorator
首先看Strategy和Decorator在GoF的《Design Patterns》的intent Decorator (1)intent: Attach additional responsibilities to an object dynamically.Decorators provide a flexible alternative to subclassing for extending functionality. (2)UML Diagram: Strategy (1)i…
我竟然混进了Python高级圈子!
现如今,计算机科学、人工智能、数据科学已成为技术发展的主要推动力。无论是要翻阅这些领域的文章,还是要参与相关任务,你马上就会遇到一些拦路虎:想过滤垃圾邮件,不具备概率论中的贝叶斯思维恐怕不行;想试…

unity3d中旋转
自转是Rotate,绕转是RotateAround,LookAt旋转物体自身,使其正面朝向目标点以上操作都在transform中完成转载于:https://blog.51cto.com/568464209/1764050

Java常用方法
1. 把Strings转换成int和把int转换成StringString a String.valueOf(2); //integer to numeric string int i Integer.parseInt(a); //numeric string to an int String a String.valueOf(2); //integer to numeric stringint i Integer.parseInt(a); //numeric string …
request.getSession(false)到底返回什么
HttpSession session request.getSession(false); 很明显传false如果session不存在返回Null。
洞察疫情,微软推出新冠数据分析网站COVID Insights
来源 | 微软研究院AI头条COVID Insights 网站功能亮点持续数月的新冠疫情一路肆虐、席卷全球,世界各地的科研人员都在为此奋战,希望通过最先进的技术逐步揭开新冠病毒的神秘面纱。近日,微软亚洲研究院的研究人员基于在计算生物学、数据分析等…