设为首页 收藏本站
查看: 336|回复: 0

[经验分享] Tomcat--线程上下文修改器

[复制链接]
累计签到:2 天
连续签到:1 天
发表于 2017-1-31 11:55:28 | 显示全部楼层 |阅读模式
HowTomcatWorks第三章第一部分就是StringManager工具类.Tomcat使用属性文件管理错误信息.并且把属性文件分散到各个包内,避免单个属性文件过于庞大.为了实现国际化,Tomcat为每个包配置多个不同语言版本的属性文件,它们都以LocalString开头,后面为相应语言的简写.(例如中文为LocalString_zh.properties)StringManager则可以根据传递进来的包名和locale,通过内置的ResourceBundle来加载特定包下的属性文件.
        然而继第二章之后,我再次遇到了类加载的问题.下面是Tomcat7中StringManager的构造方法.
private StringManager(String packageName, Locale locale) {
String bundleName = packageName + ".LocalString";
ResourceBundle bnd = null;
try {
bnd = ResourceBundle.getBundle(bundleName, locale);
} catch (MissingResourceException mre) {
ClassLoader cl = Thread.currentThread().getContextClassLoader();
if (cl != null) {
try {
bnd = ResourceBundle.getBundle(packageName, locale, cl);
} catch (MissingResourceException mre2) {
// ignore;
}
}
}
bundle = bnd;
if (bundle != null) {
this.locale = bundle.getLocale();
} else {
this.locale = null;
}
}

       getBundle加载失败后为什么要用线程上下文加载器再加载一遍?
       为了解决这个疑惑,我首先在网上找到这么一段.
引用
为什么要引入线程的上下文类加载器?将它引入J2SE并不是纯粹的噱头,由于Sun没有提供充分的文档解释说明这一点,这使许多开发者很糊涂。实际上,上下文类加载器为同样在J2SE中引入的类加载代理机制提供了后门。通常JVM中的类加载器是按照层次结构组织的,目的是每个类加载器(除了启动整个JVM的原初类加载器)都有一个父类加载器。当类加载请求到来时,类加载器通常首先将请求代理给父类加载器。只有当父类加载器失败后,它才试图按照自己的算法查找并定义当前类。
有时这种模式并不能总是奏效。这通常发生在JVM核心代码必须动态加载由应用程序动态提供的资源时。拿JNDI为例,它的核心是由JRE核心类(rt.jar)实现的。但这些核心JNDI类必须能加载由第三方厂商提供的JNDI实现。这种情况下调用父类加载器(原初类加载器)来加载只有其子类加载器可见的类,这种代理机制就会失效。解决办法就是让核心JNDI类使用线程上下文类加载器,从而有效的打通类加载器层次结构,逆着代理机制的方向使用类加载器。


        通常在默认的情况下工程中src下的所有.java文件经过编译后都存放到bin/classes下,由类路径加载器加载.属性文件也是由类加载器加载到内存中.于是如果直接调用ResourceBundle.getBundle(packageName,locale).ResourceBundle会将调用者的classloader作为默认的classloader,也就是说这个属性文件也将由类路径加载器加载.然而我们可能面临的情况是,属性文件并不在classpath中,这样的话即使给出文件的全限定名,加载器也看不到这个文件.这样就导致了加载失败.
       相对的,线程上下文加载器正可以在此时发挥作用.正如引用所说,如果线程上下文加载器默认为系统类加载器,但线程上下文加载器是可以手动指定的.于是我们就可以创建一个自定义类加载器,将属性文件所在的目录设置成参数.然后将这个加载器对象传递到getBundle(packageName, locale, cl)方法中.这时getBundle方法会
顺利加载属性文件,随后进行相应的处理.
       这就是目前我对类上下文加载器应用的解读

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-335699-1-1.html 上篇帖子: php+mysl+tomcat环境搭建手册 下篇帖子: tomcat源码分析系列之启动
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表