sustain/src/main/java/net/happyonroad/component/container/support/DefaultComponentLoader.java
public void quickLoad(Component component) throws Exception {
        if (component.isAggregating()) {
            logger.trace("Needn't real load aggregating component {}", component);
            loadedFeatures.put(component, FeatureResolver.AggregatingFlag);
        } else if (component.isPlain()) {
            logger.trace("Needn't real load plain component {}", component);
            loadedFeatures.put(component, FeatureResolver.PlainFlag);
        } else {
            if (isLoading(component)) return;
            long start = System.currentTimeMillis();
            loading(component);
            ComponentResource resource = component.getResource();
            if (resource == null) {
                throw new IOException("The component " + component + " without resource");
            }
            logger.info("Loading {}", component);
            List<FeatureResolver> resolvers = new ArrayList<FeatureResolver>(featureResolvers.size());
            for (FeatureResolver featureResolver : featureResolvers) {
                featureResolver.applyDefaults(component);
                if (featureResolver.hasFeature(component)) {
                    resolvers.add(featureResolver);
                }
            }

            for (FeatureResolver featureResolver : resolvers) {
                featureResolver.beforeResolve(component);
            }
            for (FeatureResolver featureResolver : resolvers) {
                featureResolver.resolve(component);
            }
            for (FeatureResolver featureResolver : resolvers) {
                featureResolver.afterResolve(component);
            }
            loaded(component);
            logger.info("Loaded  {} ({})", component, formatDurationHMS(System.currentTimeMillis() - start));
        }
    }
public void quickLoad(Component component) throws Exception {
        if (component.isAggregating()) {
            logger.trace("Needn't real load aggregating component {}", component);
            loadedFeatures.put(component, FeatureResolver.AggregatingFlag);
        } else if (component.isPlain()) {
            logger.trace("Needn't real load plain component {}", component);
            loadedFeatures.put(component, FeatureResolver.PlainFlag);
        } else {
            if (isLoading(component)) return;
            long start = System.currentTimeMillis();
            loading(component);
            ComponentResource resource = component.getResource();
            if (resource == null) {
                throw new IOException("The component " + component + " without resource");
            }
            logger.info("Loading {}", component);
            List<FeatureResolver> resolvers = new ArrayList<FeatureResolver>(featureResolvers.size());
            for (FeatureResolver featureResolver : featureResolvers) {
                featureResolver.applyDefaults(component);
                if (featureResolver.hasFeature(component)) {
                    resolvers.add(featureResolver);
                }
            }

            for (FeatureResolver featureResolver : resolvers) {
                featureResolver.beforeResolve(component);
            }
            for (FeatureResolver featureResolver : resolvers) {
                featureResolver.resolve(component);
            }
            for (FeatureResolver featureResolver : resolvers) {
                featureResolver.afterResolve(component);
            }
            loaded(component);
            logger.info("Loaded  {} ({})", component, formatDurationHMS(System.currentTimeMillis() - start));
        }
    }
实际卸载一个组件，不考虑依赖情况

@param component 被加载的组件
@throws IOException 加载过程中的IO错误