org.apache.catalina.startup.ContextConfig.configureStart()
org.apache.catalina.startup.ContextConfig.webConfig()
进入org.apache.catalina.startup.ContextConfig.processServletContainerInitializers
processServletContainerInitializers参考:Spring源码分析【1】-Tomcat和Sping的连接点
回到org.apache.catalina.startup.ContextConfig.webConfig()
加载/WEB-INF/classes下的资源
org.apache.catalina.startup.ContextConfig.processAnnotationsWebResource
con目录下2个子目录
递归所有的目录
继续
找到第一个文件,非文件夹的
然后进入到
else if (webResource.isFile() &&
webResource.getName().endsWith(".class"))
进入processAnnotationsStream
org.apache.tomcat.util.bcel.classfile.ClassParser.ClassParser()
org.apache.tomcat.util.bcel.classfile.ClassParser.Parser()
org.apache.tomcat.util.bcel.classfile.ClassParser.readID()
java.io.DataInputStream.readInt()
org.apache.tomcat.util.bcel.classfile.ClassParser.readClassInfo
回到processAnnotationsStream
org.apache.catalina.startup.ContextConfig.checkHandlesTypes
org.apache.catalina.startup.ContextConfig.populateJavaClassCache
populateJavaClassCache(javaClass.getSuperclassName());
父类java/lang/Object.class
回到checkHandlesTypes
回到processAnnotationsStream
回到processAnnotationsWebResource
继续循环遍历其他的class文件:com\alipay\sign\Base64.class
javaClassCache增加了com.alipay.sign.Base64
如此这般
下一步开始循环自己定义的包,例如这个XXbean.class
org.apache.catalina.startup.ContextConfig.webConfig()
从以上可以看出对于类的加载是按照编译文件的约定目录去寻找的
回到org.apache.catalina.startup.ContextConfig.webConfig()
中间一些过程加载XML配置文件暂时先过,到下面这一步:
org.apache.catalina.core.StandardContext的addServletContainerInitializer方法
回到org.apache.catalina.startup.ContextConfig.lifecycleEvent()
回到org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent
fireLifecycleEvent
org.apache.catalina.core.StandardContext.startInternal()
org.springframework.web.SpringServletContainerInitializer.onStartup
得到List
下面是分别对SecurityWebInitializer和SpingWebInitializer
SpingWebInitializer的加载参考:Spring源码分析【3】-SpingWebInitializer的加载