tomcat类加载器深刻研究笔记

一、StandardClassLoader 继承自URLClassLoader,和URLClassLoader相比没有添加任务新的功能。这个类已经被tomcat7.x废弃掉了,官方准备在tomcat8.x版本中去掉这个类java

二、BootStrapClassLoader是用本地代码实现的,它负责加载核心的java class(即全部java.*开头的类)。另外JVM还提供了两个类加载器,ExtensionClassLoaderSystemClassLoader。都是用java编写的,都是java.lang.ClassLoader的子类,由Bootstrap ClassLoader加载后才能使用。其中Extension ClassLoader负责加载扩展的java class(例如全部的javax.*开头的类和存放在JRE的ext目录下的类)System ClassLoader负责加载应用程序自身的类。web

三、URLClassLoader是SecureClassLoader的子类apache

四、URLClassLoader经过findClass方法来加载一个类。数组

五、Package的建立中会搜集jar包中manifest中的一些描述信息。tomcat

六、要自定义类加载器,须要继承 java.lang.ClassLoader 并要重写其中的findClass方法,由于若是不重写这个方法的话,默认是抛出ClassNotFoundException的app

七、Protected final Class<?>defineClass(String name,byte[] b,int off,int len);这个方法将一个字节数组转换成一个Class并初始化。若是不能转换的话,就会抛一个异常ClassFormatErrorjsp

八、New 是在编译的时候检查.class类型和路径,class.forName(“xxx”).newInstance()是在运行时找到给路径的类进行实例化,至关于先检查路径而后再进行实例化。函数

九、Class下的newInstance()的使用有局限,由于它生成的对象只能调用无参的构造函数,而使用new关键字生成的对象没有这个限制。spa

十、Q:为何说servlet 只能访问WEB-INF/classes下面的类线程

        A:其实这句话我理解错了,这句话的意思不是说servlet去载入某些类,而是当载入servlet的时候,只能把servlet放到WEB-INF/classes或者WEB-INF/lib中

十一、当准备运行servlet的时候,必须把它存放到其中一个web应用程序的/WEB-INF/classes目录中,这样就能够经过web程序的上下文路径和该servlet名来调用该servlet了。

十二、WebappLoader的866行和918行指定了要加载的servlet类的范围,是写死的/WEB-INF/classes  /WEB-INF/lib

1三、WEB-INF\web.xml :<load-on-startup>1<load-on-startup> 代表在应用程序启动的时候执行指定的servlet,这里的1表明被加载的优先级数值越小,表明被加载的优先级越高

1四、$CATALINA_HOME/conf/ 下的web.xml 仍是须要好好研究一下的。

1五、$CATALINA_HOME/conf/web.xml 当中配置了一个默认的Servlet,叫做:org.apache.catalina.servlets.DefaultServlet,这个Servlet主要负责服务 图片资源以及静态资源,像jsp这种资源则不提供服务。

1六、Web.xml 的解析在ContextConfig这个类中完成。

1七、WebRuleSet 这个类负责定义了解析部署描述符web.xml涉及到的规则以及规则路径的定义

1八、JSP的编译器是org.apache.jasper.compiler.Compiler,负责将jsp文件编译成servlet

1九、$WEB-INF_HOME/conf/web.xml 这个目录下配置了两个Servlet的,这两个servlet都在启动的时候去加载,一个是org.apache.catalina.servlets.DefaultServlet,另外一个是org.apache.jasper.servlet.JspServlet一个servlet主要负责静态资源的访问加载第二个Servlet主要负责JspServlet的编译解析

20、Tomcat的容器实现热部署使用了两种机制:

  • ClassLoader重写,经过自定义classloader加载相应的jsp编译后的class到JVM中。

  • 经过动态的修改内存中的本身码,将修改过的class再次装在到JVM中。

2一、Tomcat中为了加载jsp编译好的类,实现了一个Jsp的一个类加载器,类的权限定名是:

org.apache.jasper.servlet.JasperLoader.

2二、对于jsp页面tomcat都用了一个独立的classloader来装载,每次修改完jsp后,tomcat都将使用一个新的classloader来装载它。(有疑问??)

2三、ContainerBase 当中有个backgroundProcess()方法,貌似是用来定时检查文件的修改,实现热部署的。

2四、在Container接口中,定义了backgroundProcess()方法,这个方法的目的是为容器起一条后台线程,在后台定时的去作一些事情,好比说类的热部署。

相关文章
相关标签/搜索