一、StandardClassLoader 继承自URLClassLoader,和URLClassLoader相比没有添加任务新的功能。这个类已经被tomcat7.x废弃掉了,官方准备在tomcat8.x版本中去掉这个类。java
二、BootStrapClassLoader是用本地代码实现的,它负责加载核心的java class(即全部java.*开头的类)。另外JVM还提供了两个类加载器,ExtensionClassLoader和SystemClassLoader。都是用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并初始化。若是不能转换的话,就会抛一个异常ClassFormatError。jsp
八、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()方法,这个方法的目的是为容器起一条后台线程,在后台定时的去作一些事情,好比说类的热部署。