章前准备
人人都知道类加载器很重要,原本以为自定义加载时指定是如何确定链接,载入之类的传说中的关联方式,看完之后发现自己还是too young,类如何加载如何链接都是jvm的事情,做为程序猿只能控制两件事,字节码生成和类加载器
字节码生成:标准的java,jsp,听说Python等脚本也可以- -!
类加载器:实现ClassLoader的类,所有方法都实现好了的抽象类- -
我在看类加载器的时候不断地寻找加载的方法在哪里...现在想来自定义类加载器也就是让你决定一下是否加载(有点阈的概念),怎么加载(我是说链接什么的),跟我们真没什么缘分(仔细想想自己认为的加载器,好像还真得是jvm的一部分才行),仔细想想如果只有一个加载器会怎么样
1.核心类与自定义类重名(启动/引导加载器,bootstrap还真是出名)
2.同一台服务器上不同的项目的类库分离(比如jdk1.4和jdk1.7)
3.同一台服务器上不同的项目的类库共用
4.热启动(jsp是servlet,但jsp的修改不需要重启,servlet不会)
第一个问题好说,整个检查就好了,第二个也好说两个不同的类加载器就好了,第三个有点蛋疼,第四个就....即使被称为类加载器,说到底还是类被加载时遇见一些问题(或需求)的解决方案,tomcat类加载器方案重点是热启动(jsp修改)和安全限制,听说还有一个更为经典的加载架构OSGI,改天看看吧(最重要的还是要弄清楚加载器进行加载的策略以及自定义加载器能干什么)
关于类加载器吐个小槽,当年面试的时候有个面试官问我单例模式在同一个项目中是否只有一个,我说是,他说不是(万一人家有多个类加载器累)
第八章 载入器
自定义的类加载器并不是解决类如何链接,加载的问题,而是解决一下几个需求
1.自动载入WEB-INF/classes或WEB-INF/lib 下的类(不介意使用线程哦)
2.预加载与缓存
3.jsp的热加载(动态加载,动态生成,我喜欢)
至于安全保护什么的也算,不过我认为java大叔提供的加载方案已经保护的超不多了,基于以上tomcat给的解决方案就是本章的内容
WebappLoader:项目加载的详细说明,实现Loader(tomcat的)接口,为具体实现做准备工作,包括:
1.创建具体的类加载器
2.设置仓库
3.设置类路径
4.设置访问权限
5.开启线程进行检查
这个类可以控制手下的类加载器具体加载的仓库,与context相关义不容辞
WebappClassLoader:优化与安全,如
1.缓存机制的建立
2.特殊类的保护