一个功能健全的Web服务器,要解决如下几个问题:

  • 部署在同一个服务器上的两个Web应用程序使用的Java 类库可以实现相互隔离。不能要求一个类库在一个服务器中只有一份,服务器应当保证两个应用程序的类库可以互相独立使用。
  • 部署在同一个服务器上的两个Web应用程序所使用的Java类库可以互相共享,如果Java类库不能共享使用,虚拟机的方法区很容易出现过度膨胀的风险,比如一台服务器上部署了10个使用Spring的程序。
  • 服务器需要尽可能保证自身安全不受部署的Web应用程序影响。服务器所使用的类库应该与应用程序使用的类库互相独立。
  • 支持JSP的服务器,大部分都需要支持HotSwap功能(热交换功能)

  Tomcat目录结构中,有三组目录(“/common/*”,“/server/*”和“shared/*”)可以存放公用Java类库,此外还有第四组Web应用程序自身的目录“/WEB-INF/*”,把java类库放置在这些目录中的含义分别是:

  • 放置在common目录中:类库可被Tomcat和所有的Web应用程序共同使用。
  • 放置在server目录中:类库可被Tomcat使用,但对所有的Web应用程序都不可见。
  • 放置在shared目录中:类库可被所有的Web应用程序共同使用,但对Tomcat自己不可见。
  • 放置在/WebApp/WEB-INF目录中:类库仅仅可以被此Web应用程序使用,对Tomcat和其他Web应用程序都不可见。

为了支持这套目录结构,并对目录里面的类库进行加载和隔离,Tomcat自定义了多个类加载器,这些类加载器按照经典的双亲委派模型来实现,如下图所示 :

Spring加载问题:

Tomcat 加载器的实现清晰易懂,并且采用了官方推荐的“正统”的使用类加载器的方式。这时作者提一个问题:如果有 10 个 Web 应用程序都用到了spring的话,可以把Spring的jar包放到 common 或 shared 目录下让这些程序共享。Spring 的作用是管理每个web应用程序的bean,getBean时自然要能访问到应用程序的类,而用户的程序显然是放在 /WebApp/WEB-INF 目录中的(由 WebAppClassLoader 加载),那么在 CommonClassLoader 或 SharedClassLoader 中的 Spring 容器如何去加载并不在其加载范围的用户程序(/WebApp/WEB-INF/)中的Class呢?

解答:

spring根本不会去管自己被放在哪里,它统统使用线程上下文加载器来加载类,而线程上下文加载器默认设置为了WebAppClassLoader,也就是说哪个WebApp应用调用了spring,spring就去取该应用自己的WebAppClassLoader来加载bean。

线程上下文类加载器的适用场景: 
1. 当高层提供了统一接口让低层去实现,同时又要是在高层加载(或实例化)低层的类时,必须通过线程上下文类加载器来帮助高层的ClassLoader找到并加载该类。 
2. 当使用本类托管类加载,然而加载本类的ClassLoader未知时,为了隔离不同的调用者,可以取调用者各自的线程上下文类加载器代为托管。

简而言之就是ContextClassLoader默认存放了AppClassLoader的引用,由于它是在运行时被放在了线程中,所以不管当前程序处于何处(BootstrapClassLoader或是ExtClassLoader等),在任何需要的时候都可以用Thread.currentThread().getContextClassLoader()取出应用程序类加载器来完成需要的操作。

最新文章

  1. Android学习第三天-签名常用命令
  2. CentOS6.3连接Xshell出现的问题(连接失败--需要设置ONBOOT=“yes”,开启网卡驱动)
  3. MySQL的安装与配置
  4. 也来山寨一版Flappy Bird (js版)
  5. LA 3401 - Colored Cubes
  6. C#中自定义消息,与MFc对比
  7. MyEclipse设置默认的目光格式
  8. maven中pom.xml
  9. Swagger 生成 ASP.NET Web API
  10. ubuntu 设置vpn
  11. Linux(UBUNTU) 下安装Eclipse
  12. iOS 工程默认只允许竖屏,在单独界面进行横竖转换,屏幕旋转
  13. 并发编程基础之volatile关键字的用法
  14. LPC43xx State Configurable Timer : SCT
  15. ubuntu11.10 64bit 编译android 4.0
  16. python 与 mongodb的交互
  17. 支付宝、微信、QQ 收款二维码三合一
  18. scrapy使用PhantomJS和selenium爬取数据
  19. java 资源文件的读取
  20. 【移动互联网开发】Zepto 使用中的一些注意点 【转】

热门文章

  1. ArcGIS10.2中文版安装和破解教程
  2. 有关parent.frame.cols在firefox浏览器上不兼容的问题解决
  3. 基于C#的PISDK研究(理论)
  4. Visual Studio 2012,创建工程Build Driver,基于纯Source Code.
  5. PhalApi 1.4.2 经典封存版 - 码云
  6. 算法(13)Contiguous Array
  7. NIO Q&A(持续补充。。。。)
  8. java高精度类尝试
  9. 【题解】NOIP2016愤怒的小鸟
  10. 【CF Round 434 B. Which floor?】