在ofbiz中有一个自定义的ClassLoader:CachedClassLoader,这个方法有什么用呢?
通过查看源代码我们发现
public static final String module = CachedClassLoader.class.getName();
public static final ConcurrentHashMap<String, Class<?>> globalClassNameClassMap = new ConcurrentHashMap<String, Class<?>>();
private static final Set<String> globalBadClassNameSet = new CopyOnWriteArraySet<String>();
private static final ConcurrentHashMap<String, URL> globalResourceMap = new ConcurrentHashMap<String, URL>();
private static final Set<String> globalBadResourceNameSet = new CopyOnWriteArraySet<String>();
private final String contextName;
private final ConcurrentHashMap<String, Class<?>> localClassNameClassMap = new ConcurrentHashMap<String, Class<?>>();
private final Set<String> localBadClassNameSet = new CopyOnWriteArraySet<String>();
private final ConcurrentHashMap<String, URL> localResourceMap = new ConcurrentHashMap<String, URL>();
private final Set<String> localBadResourceNameSet = new CopyOnWriteArraySet<String>();
这个类其实是存储我们加载到ClassLoader中的类信息的,有什么用呢?
因为在ofbiz中,每一个模块都生成了自己独立的jar文件,这个CachedClassLoader的作用就是如何加载和管理这些jar文件,有点动态部署的意思。
然后我们来看一看这个ClassLoader是如何启动的
在framework\base\ofbiz-component.xml里边有以下配置
<!-- load the cached classloader container (always second) --> <container name="classloader-container" loaders="main,rmi,pos,install,test" class="org.ofbiz.base.container.ClassLoaderContainer"/>
注释上已经说的很明白了,第二个启动,第一个启动的是component-container组件加载器
在ClassLoaderContainer中,有以下代码
//获取当前的ClassLoader
ClassLoader parent = Thread.currentThread().getContextClassLoader();
......
//组件新的ClassLoader
cl = new CachedClassLoader(new URL[0], parent);
........
//设置新的ClassLoader
Thread.currentThread().setContextClassLoader(cl);
OK,这样就将由CachedClassLoader来管理ofbiz的类加载了
个人见解,如有错误,望不吝赐教,欢迎探讨
转载于:https://blog.51cto.com/canghailongteng/1663041