类加载策略需求文档
-
需求概述
支持类加载策略的配置,包括父类优先、子类优先两种加载方式并可以通过过滤方式反向调整单个或者多个类的优先级顺序。 -
其他中间件实现
2.1 weblogic 14.1.1.0中的实现。
weblogic.xml中配置以下参数,来设定加载顺序:
1、 prefer-application-packages、prefer-application-resources
可以指定包名,始终由应用加载(需要2中的配置prefer-web-inf-classes为false)。
区别:
prefer-application-packages:应用类加载器优先于容器去加载
prefer-application-resources:只在应用类加载器中搜索。
2、 prefer-web-inf-classes
设置为true,加载顺序为:
1) Web应用程序WEB-INF目录中的类,
2) 应用程序或系统类加载器中加载的类。
参考地址:
https://docs.oracle.com/en/middleware/standalone/weblogic-server/14.1.1.0/wbapp/weblogic_xml.html#GUID-56955103-7F68-44B9-8D14-137BCDD904ED
2.2 BES中的实现
通过配置bes-web.xml中class-loader元素来设定加载顺序(Ejb通过bes-ejb-jar.Xml中相同元素),overridablePackages(环境变量)指定排除的包名。
class-loader包含delegate、filter集合;filter包含package-name(要过滤的包名)、class-name(类名)、resource-file(资源文件)、resources-scope、scope。
加载class时,逻辑如下:
1、 delegate配置为true或者overridablePackages包名中包含有该class,判定delegate为true,即父加载优先。
2、 当父加载优先并且filter中包名类名都不包含class时、或者子加载优先并且filter中包含class时,由父加载器优先加载;否则,子加载器优先加载。
也就是说,如果filter中包含class,则与delegate的设定反向加载
3、 如果class的scope为self时,当前类加载器加载不到时,抛出ClassNotFoundException。比如:如果是父加载器优先加载,父加载器加载不到,子加载器不会继续尝试加载。
加载resource时,加载逻辑同上,scope是单独的resources-scope来设定。
- Tongweb实现
3.1 Web应用
配置tongweb-web-app.xml文件:
1、prefer-app-packages
可以指定包名、类名、资源文件,配置后,始终由应用加载,若应用类加载器加载不到则抛出异常。
2、prefer-app-resources
可以指定资源文件,配置后,只在应用类加载器中搜索。
3.2 EAR应用
配置tongweb-ejb-jar文件:
1、 prefer-app-packages、prefer-app-resources配置说明同3.1中相同。
2、EAR中包含多个ejb应用时,会合并配置,包含的war包按3.1中Web应用的逻辑。
注:扫描注解时,容器类加载器会扫描到EAR中WAR包内的类,会加载进来,但是实际使用的还是web应用类加载器加载的CLASS实例(可以将war包中的类配置到tongweb-ejb-jar.xml文件中,即可避免)。