在ofbiz中,主要有三种container

  1. 系统启动时候的container

    wKioL1WCbe7CLfMBAAJRrxpd7o0715.jpg这个在启动类中被调用,根据framework\base\config\ofbiz-containers.xml中的定义加载其他容器

  2. 用来加载组件的container

    wKiom1WCbQKSgNVuAAVkMc4P3IM658.jpg

    在这里边定义的container会被顶层container启动,执行指定的class类

    这里定义的container执行的时候基本上是组件还没有加载

  3. 组件中component-load.xml定义的container

    wKioL1WCb9nyzGFLAAgvZ0ig_po991.jpg这里边的容器基本上是在组件配置全部加载完毕后开始执行



  4. //获取全部组件中定义的container
            List<ContainerConfig.Container> containersDefinedInComponents = ComponentConfig.getAllContainers();
            for (ContainerConfig.Container containerCfg: containersDefinedInComponents) {
                boolean matchingLoaderFound = false;
                if (UtilValidate.isEmpty(containerCfg.loaders) && UtilValidate.isEmpty(loaders)) { //比较启动级别
                    matchingLoaderFound = true;
                } else {
                    for (String loader: loaders) {
                        if (UtilValidate.isEmpty(containerCfg.loaders) || containerCfg.loaders.contains(loader)) {
                            matchingLoaderFound = true;
                            break;
                        }
                    }
                }
                if (matchingLoaderFound) {
                    Debug.logInfo("Loading component's container: " + containerCfg.name, module);
                    Container tmpContainer = loadContainer(containerCfg, args); //加载Container,执行其中的init方法
                    this.loadedContainers.add(tmpContainer);//加入缓存
                    Debug.logInfo("Loaded component's container: " + containerCfg.name, module);
                }
            }

总结:

  这三个地方的container并没有什么不同,主要是因为启动顺序和作用的问题把这些container写在不同的配置文件中