tomcat类加载器深入研究笔记

爱⌒轻易说出口 提交于 2019-12-01 01:49:18

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

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

3、URLClassLoader是SecureClassLoader的子类

4、URLClassLoader通过findClass方法来加载一个类。

5、Package的创建中会搜集jar包中manifest中的一些描述信息。

6、要自定义类加载器,需要继承 java.lang.ClassLoader 并要重写其中的findClass方法,因为如果不重写这个方法的话,默认是抛出ClassNotFoundException的

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

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

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

10、Q:为什么说servlet 只能访问WEB-INF/classes下面的类

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

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

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

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

14、$CATALINA_HOME/conf/ 下的web.xml 还是需要好好研究一下的。

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

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

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

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

19、$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中。

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

org.apache.jasper.servlet.JasperLoader.

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

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

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



易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!