ComponentContainer load 流程 /*     1 : 前言     ContainerLoader.java文件首先把ofbiz -     container.xml定义的container读入到了.ContainerConfig     2 : 加载  */     private Container loadContainer(String classname, String configFileLocation) throws     StartupException {   // load the component container class   ClassLoader loader = Thread.currentThread().getContextClassLoader();   if (loader == null) {     Debug.logWarning("Unable to get context classloader; using system", module);     loader = ClassLoader.getSystemClassLoader();   }   Class componentClass = null;   try {     componentClass = loader.loadClass(classname);   }   catch (ClassNotFoundException e) {     throw new StartupException("Cannot locate container class", e);   }   if (componentClass == null) {     throw new StartupException("Component container class not loaded");   } 
  Container componentObj = null;   try {     componentObj = (Container) componentClass.newInstance(); ////通过classname生成实例   }   catch (InstantiationException e) {     throw new StartupException(e);   }   catch (IllegalAccessException e) {     throw new StartupException(e);   }   catch (ClassCastException e) {     throw new StartupException(e);   } 
  if (componentObj == null) {     throw new StartupException(         "Unable to create instance of component container");   } 
  try {     componentObj.start(configFileLocation); //容器初始化   }   catch (ContainerException e) {     throw new StartupException(e);   } 
  return componentObj; } 3 : ComponentContainer加载     ComponentContainer.java类     /*        loadConfig参数是Components配置文件名,如果没有,将自动取系统自定义的        Component-Load.xml,如果需要定义,可以        <container      name="component-container" class="org.ofbiz.base.container.ComponentContainer">           <propterty name="load-config"  value="xxx.xml"/>        </container>        updateClasspath:加载完后是否重新设置classpath 
     */     public synchronized void loadComponents(String loaderConfig,                                             boolean updateClasspath) throws     AlreadyLoadedException, ComponentException {   // 设置load list,如果失败,抛出Already Loaded Exception   if (loadedComponents == null) {     loadedComponents = new LinkedList(); //用Linklist保存将要加载的Components   }   else {     throw new AlreadyLoadedException("Components already loaded, cannot start");   } 
  /*      ComponentLoader将读取Component-Load.xml, 存储所有的组件,              components存储的实例名是ComponentDef,它对应于:       <load-component component-location="${ofbiz.home}/components/minerva"/>    */   List components = ComponentLoaderConfig.getComponentsToLoad(loaderConfig); 
  /*      加载每一个Components    */   if (components != null) {     Iterator ci = components.iterator();     while (ci.hasNext()) {       ComponentLoaderConfig.ComponentDef def = (ComponentLoaderConfig.                                                 ComponentDef) ci.next();       if (def.type == ComponentLoaderConfig.SINGLE_COMPONENT) {         ComponentConfig config = null;         try {           /*在这里将要读取每个组件下的 ofbiz-component.xml文件                 比如:                 /components/minerva/ofbiz-component.xml             /components/entity/ofbiz-component.xml             ComponentConfig用一个静态的HashMap存储系统中所在的Component.                 每个ComponentConfig对应于一个ofbiz-component.xml文件.            */           config = ComponentConfig.getComponentConfig(def.name, def.location);           if (UtilValidate.isEmpty(def.name)) {             def.name = config.getGlobalName();           }         }         catch (ComponentException e) {           Debug.logError("Cannot load component : " + def.name + " @ " +                          def.location + " : " + e.getMessage(), module);         }         if (config == null) {           Debug.logError("Cannot load component : " + def.name + " @ " +                          def.location, module);         }         else { 
          /*                    主要作要就是把当前Components用到的jar放入classpath中            */           loadComponent(config);         }       }       else if (def.type == ComponentLoaderConfig.COMPONENT_DIRECTORY) { 
        loadComponentDirectory(def.location);       }     }   } 
  // set the new classloader/classpath on the current thread   if (updateClasspath) {     System.setProperty("java.class.path", classPath.toString());     ClassLoader cl = classPath.getClassLoader();     Thread.currentThread().setContextClassLoader(cl);   } 
  Debug.logInfo("All components loaded", module); } 
 mail: [email protected]
  
 
  |