Tomcat启动流程
2021-02-26 11:24:10 0 举报
Tomcat启动流程 持续完善中,这个写的有点杂乱,都是根据源码一步一步跟踪下来的。
作者其他创作
大纲/内容
初始化
通过CatalinaProperties.getProperty(name + \".loader\");加载到属性如下。\"${catalina.base}/lib\
/* Use await. */ protected boolean await = false;await的初始化的时候是false,需要在启动的时候设置标志位为true才可以正常启动端口来监听请求。
这里创建了一个解析器,用来解析server.xml文件通过流读取conf/server.xml文件*digester是和dom4j一样,都是解析xml文件用的,dom4j是将文件全部读取到内存中来解析的,效率比较高,digester是一边解析,一边读取的,效率较低,但是节约内存。
获取路径
catalinaLoader.loadClass(\"org.apache.catalina.startup.Catalina\");
通过反射调用
初始化命名
LifecycleBase
使用System.property方法将原来jdk的系统属性替换成tomcat自定义的系统属性。
homeFile == null
initInternal()
赋值给daemon
至此 init()方法结束
因为home == null ,homeFile没有赋值成功
获取用户根目录 String userDir = System.getProperty(\"user.dir\");
StandardServer
加载 conf/server.xml 文件
daemon = bootstrap;
CatalinaProperties
获取catalina.base路径
@Override public void setCatalina(Catalina catalina) { this.catalina = catalina; } @Override public void setCatalinaHome(File catalinaHome) { this.catalinaHome = catalinaHome; } @Override public void setCatalinaBase(File catalinaBase) { this.catalinaBase = catalinaBase; }
初始化类加载器
getServer().init();
getServer().setCatalina(this); getServer().setCatalinaHome(Bootstrap.getCatalinaHomeFile()); getServer().setCatalinaBase(Bootstrap.getCatalinaBaseFile());
getProperty(String key)
Server
通过反射,设置共享扩展类加载器。
赋值
super.initInternal();
configFile();
server指向的类
createStartDigester()
init()
main()
静态属性 // 守护线程锁 private static final Object daemonLock = new Object(); // 守护程序 private static volatile Bootstrap daemon = null; // 容器基本文件路径 private static final File catalinaBaseFile; // 容器主文件路径 private static final File catalinaHomeFile; // 将给定的正则表达式编译为模式。 private static final Pattern PATH_PATTERN = Pattern.compile(\"(\\\"[^\\\"]*\\\
SecurityClassLoad.securityClassLoad(catalinaLoader);
创建并配置用于启动的解析。
load(String[] arguments)
返回获取的value属性
base != null
private static Properties properties = null;
结束
实现接口
getServer().start();
start()
getProperty(String name)
LifecycleMBeanBase
静态加载
setAwait(boolean b)
catalinaDaemon = startupInstance;
设置等待标志
Properties
replace(value);
获取配置文件conf/server.xml与相关jra包路径
NamingResourcesImpl
Catalina
private Object catalinaDaemon = null; ClassLoader commonLoader = null; ClassLoader catalinaLoader = null; ClassLoader sharedLoader = null;
Thread.currentThread().setContextClassLoader(catalinaLoader);
继承
bootstrapJar.exists()
home != null
从实例化开始使用了sync
获取包含tomcat产品安装路径的系统属性名称 String home = System.getProperty(Constants.CATALINA_HOME_PROP);
initNaming()
startupClass.getConstructor().newInstance();
使用for循环遍历路径,并加载本地类库
用于读取引导Catalina配置。
setAwait(boolean await)
getServer()实质是指向了StandardServer类,
startInternal()
load()
这里采用了加锁的方式循环启动。尤为复杂
获取文件路径File f = new File(home); homeFile = f.getCanonicalFile();
initClassLoaders()
启动新的服务器实例。
Bootstrap
加载文件路径File f = new File(userDir);// /homeFile = Users/XXX/IdeaProjects/tomcat-8.5.x homeFile = f.getCanonicalFile();
设置此线程的上下文ClassLoader
Hashtable
修改await为true
catalinaBaseFile = catalinaHomeFile;
service.start();
static方法就是初始化catalinaBaseFile与catalinaHomeFile
反射
根据绝对路径加载Catalina
Bootstrap bootstrap = new Bootstrap();
globalNamingResources 指向的类
globalNamingResources.start();
init();
设置安全类加载器
静态方法
String base = System.getProperty(Constants.CATALINA_BASE_PROP);
调用父类的
调用父类方法
C
base == null
指向StandardServer 类的initINternal方法
给定字符串中的系统属性替换。实现是从ClassLoaderLogManager.replace()复制的。但为catalina.home和catalina.base添加了特殊处理。根据${} 获取value中的路径
home
getPaths(value)
父类方法
0 条评论
下一页