读书人

struts2源码浅析(2)

发布时间: 2012-07-31 12:33:46 作者: rapoo

struts2源码浅析(二)

接上一篇http://mazhiyuan.iteye.com/blog/1202064,这一篇先讲讲init方法中的7步

?

首先是init_DefaultProperties()

?

?

再来看第二步:init_TraditionalXmlConfigurations()

?

public synchronized List<PackageProvider> reloadContainer(List<ContainerProvider> providers) throws ConfigurationException {        packageContexts.clear();        loadedFileNames.clear();        List<PackageProvider> packageProviders = new ArrayList<PackageProvider>();//Struts2(xwork2)用Container来完成依赖注入的功能//首先初始化一个ContainerBuilder,再由builder来保存接口与实现类或工厂类的对应关系//然后通过builder.create(boolean)方法产生container//由container.getInstance(Class);就可以得到接口的实现实例了//这一部分比较复杂,后面研究完成了,会单独拿出来讲,这里先弄清楚Xwork依赖注入的实现步骤就可以了        ContainerProperties props = new ContainerProperties();        ContainerBuilder builder = new ContainerBuilder();        for (final ContainerProvider containerProvider : providers)        {    //循环调用ConfigurationProvider的init和register方法,明白了吧,在这里统一循环调用            containerProvider.init(this);            containerProvider.register(builder, props);        }        props.setConstants(builder);        //注入依赖关系,在这里并不产生实例        builder.factory(Configuration.class, new Factory<Configuration>() {            public Configuration create(Context context) throws Exception {                return DefaultConfiguration.this;            }        });        ActionContext oldContext = ActionContext.getContext();        try {            // Set the bootstrap container for the purposes of factory creation            Container bootstrap = createBootstrapContainer();            setContext(bootstrap);//create已经注入依赖关系的Container            container = builder.create(false);            setContext(container);            objectFactory = container.getInstance(ObjectFactory.class);            // Process the configuration providers first            for (final ContainerProvider containerProvider : providers)            {                if (containerProvider instanceof PackageProvider) {                    container.inject(containerProvider);//调用PackageProvider的loadPackages()方法,这里主要是针对XmlConfigurationProvider和StrutsXmlConfigurationProvider                    ((PackageProvider)containerProvider).loadPackages();                    packageProviders.add((PackageProvider)containerProvider);                }            }            // Then process any package providers from the plugins            Set<String> packageProviderNames = container.getInstanceNames(PackageProvider.class);            if (packageProviderNames != null) {                for (String name : packageProviderNames) {                    PackageProvider provider = container.getInstance(PackageProvider.class, name);                    provider.init(this);                    provider.loadPackages();                    packageProviders.add(provider);                }            }            rebuildRuntimeConfiguration();        } finally {            if (oldContext == null) {                ActionContext.setContext(null);            }        }        return packageProviders;    }

?

init7步执行完之后,struts2做好了接受request的准备了,下一篇会着重讲讲filter在struts中的使用。

下一篇:http://mazhiyuan.iteye.com/blog/1202104

读书人网 >开源软件

热点推荐