`
ThinkInMyLife
  • 浏览: 48768 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Webx3 初始化过程学习

阅读更多

这两天利用空余时间学习了webx3.0,基于spring mvc开发的一款mvc;由于对webx2.0以及spring mvc没有进行过深入的研究,在学习webx3.0的时候,肯定会出现理解上的偏差甚至错误,希望大家积极提出,有问题才是进步的动力;以前很少写文章,文笔不好,还请大家见谅,:)!无废话,开始:

Web.xml,tomcat加载war包开始:

<!-- 装载/WEB-INF/webx.xml, /WEB-INF/webx-*.xml -->
 <listener>  
 <listener-class>com.alibaba.citrus.webx.context.WebxContextLoaderListener</listener-class>
</listener>
 

其中WebxContextLoaderListener 信息如下:

 

import org.springframework.web.context.ContextLoader;
import org.springframework.web.context.ContextLoaderListener;

public class WebxContextLoaderListener extends ContextLoaderListener {
……
 

WebxContextLoaderListener继承了spring mvc的监听类:ContextLoaderListener;

可想而知,容器启动时,将调用: contextInitialized(ServletContextEvent event)  该方法,如下:

public void contextInitialized(ServletContextEvent event) {
                //1.初始化加载类
		this.contextLoader = createContextLoader();
               //2.出示话web上下文
		this.contextLoader.initWebApplicationContext(event.getServletContext());
	}

 

由于WebxContextLoaderListener覆盖了createContextLoader()方法,

 @Override
    protected final ContextLoader createContextLoader() {
        return new WebxComponentsLoader() {

            @Override
            protected Class<?> getDefaultContextClass() {
                Class<?> defaultContextClass = WebxContextLoaderListener.this.getDefaultContextClass();

                if (defaultContextClass == null) {
                    defaultContextClass = super.getDefaultContextClass();
                }

                return defaultContextClass;
            }
        };
    }
 

contextLoader已经是这个了:WebxComponentsLoader 重点关注这个类,

 

public class WebxComponentsLoader extends ContextLoader

 

将负责加载webx中的componet组件,还继承了spring mvc的加载类 ContextLoader,


  所以initWebApplicationContext 就在子类WebxComponentsLoader中执行了:

 

 @Override
    public WebApplicationContext initWebApplicationContext(ServletContext servletContext) throws IllegalStateException,
            BeansException {
        this.servletContext = servletContext;
        init();
        //开始spring mvc加载…        
        return super.initWebApplicationContext(servletContext);
    }

  经过自己的init后

  super.initWebApplicationContext(servletContext);

  又回到父类里面去了:

 

public WebApplicationContext initWebApplicationContext(ServletContext servletContext)
			throws IllegalStateException, BeansException {

                  //.....先忽略
		long startTime = System.currentTimeMillis();

		try {
			// Determine parent for root web application context, if any.
                        //1.先找parent,一般是空的吧
			ApplicationContext parent = loadParentContext(servletContext);

			// Store context in local instance variable, to guarantee that
			// it is available on ServletContext shutdown.
                        //2.创建
			this.context = createWebApplicationContext(servletContext, parent);
                        //3.设为root
			servletContext.setAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, this.context);
			currentContextPerThread.put(Thread.currentThread().getContextClassLoader(), this.context);

			//再忽略...
			return this.context;
		}
		catch (RuntimeException ex) {
			logger.error("Context initialization failed", ex);
			servletContext.setAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, ex);
			throw ex;
		}
		catch (Error err) {
			logger.error("Context initialization failed", err);
			servletContext.setAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, err);
			throw err;
		}
	}

  createWebApplicationContext方法主要包括下面4步:

 1.找到上下文类

Class contextClass = determineContextClass(servletContext);

 定位上下文class,这个class可配置;这个方法被WebxContextLoaderListener覆盖,最后返回的class:

return WebxComponentsContext.class;

第二个重要的类出现:WebxComponentsContext
WebxComponentsContext

继承

WebxApplicationContext(webx重写)

继承

XmlWebApplicationContext(spring原生)

 

2.实例化上下文类

ConfigurableWebApplicationContext wac = (ConfigurableWebApplicationContext) BeanUtils.instantiateClass(contextClass);
wac.setParent(parent);
wac.setServletContext(servletContext);	
wac.setConfigLocation(servletContext.getInitParameter(CONFIG_LOCATION_PARAM));

 

3.可以自定义操作上下文

customizeContext(servletContext, wac);
//被子类覆盖

 此方法也被WebxContextLoaderListener覆盖:

protected void customizeContext(ServletContext servletContext, ConfigurableWebApplicationContext componentsContext) {
     this.componentsContext = componentsContext;
     if (componentsContext instanceof WebxComponentsContext) {
		// componentsContext就是上面实例化的上下文,铁定是WebxComponentsContext类
               ((WebxComponentsContext) componentsContext).setLoader(this);
		//为load webx组件配置文件而准备
     }
}
 

4.初始化IOC容器

wac.refresh();

 
看到熟悉的refush方法了,ConfigurableWebApplicationContext是没有refush方法,AbstractApplicationContext这个类有refush方法:

public void refresh() throws BeansException, IllegalStateException {
		synchronized (this.startupShutdownMonitor) {
			// Prepare this context for refreshing.
			prepareRefresh();

			// Tell the subclass to refresh the internal bean factory.
			ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();

			// Prepare the bean factory for use in this context.
			prepareBeanFactory(beanFactory);

			try {
				// Allows post-processing of the bean factory in context subclasses.
				postProcessBeanFactory(beanFactory);
                                //被覆盖,重点关注

                                // Invoke factory processors registered as beans in the context.
				invokeBeanFactoryPostProcessors(beanFactory);

				// Register bean processors that intercept bean creation.
				registerBeanPostProcessors(beanFactory);

				// Initialize message source for this context.
				initMessageSource();

				// Initialize event multicaster for this context.
				initApplicationEventMulticaster();

				// Initialize other special beans in specific context subclasses.
				onRefresh();

				// Check for listener beans and register them.
				registerListeners();

				// Instantiate all remaining (non-lazy-init) singletons.
				finishBeanFactoryInitialization(beanFactory);

				// Last step: publish corresponding event.
				finishRefresh();
                                //被覆盖,重点关注			
                        }

			catch (BeansException ex) {
				// Destroy already created singletons to avoid dangling resources.
				beanFactory.destroySingletons();

				// Reset 'active' flag.
				cancelRefresh(ex);

				// Propagate exception to caller.
				throw ex;
			}
		}
	}
 

postProcessBeanFactory(beanFactory);有覆盖吗?有!

实例化前,webx覆盖了此方法来,进行把webx组件实例放入spring中,怎么放?哪里执行?

((WebxComponentsContext) componentsContext).setLoader(this);

 这里看出是WebxComponentsLoader来进行这个工作:

/**
     * 在创建beanFactory之初被调用。
     * 
     * @param webxComponentsContext
     */
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) {
        // 由于初始化components依赖于webxConfiguration,而webxConfiguration可能需要由PropertyPlaceholderConfigurer来处理,
        // 此外,其它有一些BeanFactoryPostProcessors会用到components,
        // 因此components必须在PropertyPlaceholderConfigurer之后初始化,并在其它BeanFactoryPostProcessors之前初始化。
        //
        // 下面创建的WebxComponentsCreator辅助类就是用来确保这个初始化顺序:
        // 1. PriorityOrdered - PropertyPlaceholderConfigurer
        // 2. Ordered - WebxComponentsCreator
        // 3. 普通 - 其它BeanFactoryPostProcessors
        BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(WebxComponentsCreator.class);
        builder.addConstructorArgValue(this);
        BeanDefinition componentsCreator = builder.getBeanDefinition();
        componentsCreator.setAutowireCandidate(false);

        BeanDefinitionRegistry registry = (BeanDefinitionRegistry) beanFactory;
        String name = SpringExtUtil.generateBeanName(WebxComponentsCreator.class.getName(), registry);

        registry.registerBeanDefinition(name, componentsCreator);
    }
 

一个内部类,WebxComponentsCreator辅助类就是用来确保初始化顺序,见上面:

 public static class WebxComponentsCreator implements BeanFactoryPostProcessor, Ordered {
        private final WebxComponentsLoader loader;

        public WebxComponentsCreator(WebxComponentsLoader loader) {
            this.loader = assertNotNull(loader, "WebxComponentsLoader");
        }

        public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
            if (loader.components == null) {
                WebxComponentsImpl components = loader.createComponents
(loader.getParentConfiguration(), beanFactory);
                AbstractApplicationContext wcc = (AbstractApplicationContext) components.getParentApplicationContext();
                wcc.addApplicationListener(new SourceFilteringListener(wcc, components));
                loader.components = components;
            }
        }

        public int getOrder() {
            return Ordered.LOWEST_PRECEDENCE;
        }
    }

 初始化components:

 /**
     * 初始化components。
     */
    private WebxComponentsImpl createComponents(WebxConfiguration parentConfiguration,
                                                ConfigurableListableBeanFactory beanFactory) {
        
        //1.取得一组关于components的配置,也就是component的配置文件,ComponentsConfigImpl中
        ComponentsConfig componentsConfig = getComponentsConfig(parentConfiguration);
        


        // 2.假如isAutoDiscoverComponents==true,试图自动发现components 
        Map<String, String> componentNamesAndLocations = findComponents(componentsConfig, getServletContext());

        // 3.取得特别指定的components
        Map<String, ComponentConfig> specifiedComponents = componentsConfig.getComponents();

        // 4.实际要初始化的comonents,为上述两种来源的并集
        Set<String> componentNames = createTreeSet();

        componentNames.addAll(componentNamesAndLocations.keySet());
        componentNames.addAll(specifiedComponents.keySet());

        // 5.创建root controller
        WebxRootController rootController = componentsConfig.getRootController();

        if (rootController == null) {
            rootController = (WebxRootController) BeanUtils.instantiateClass(componentsConfig.getRootControllerClass());
        }

        // 6.创建并将components对象置入resolvable dependencies,以便注入到需要的bean中
        WebxComponentsImpl components = new WebxComponentsImpl(componentsContext, componentsConfig
                .getDefaultComponent(), rootController, parentConfiguration);

        beanFactory.registerResolvableDependency(WebxComponents.class, components);

        // 7.初始化每个component
        for (String componentName : componentNames) {
            ComponentConfig componentConfig = specifiedComponents.get(componentName);

            String componentPath = null;
            WebxController controller = null;

            if (componentConfig != null) {
                componentPath = componentConfig.getPath();
                controller = componentConfig.getController();
            }

            if (controller == null) {
                controller = (WebxController) BeanUtils.instantiateClass(componentsConfig.getDefaultControllerClass());
            }

            WebxComponentImpl component = new WebxComponentImpl(components, componentName, componentPath, componentName
                    .equals(componentsConfig.getDefaultComponent()), controller, getWebxConfigurationName());

            components.addComponent(component);

            prepareComponent(component, componentNamesAndLocations.get(componentName));
        }

        return components;
    }

  怎么找到components,只要找到对应配置项即可

public String getComponentConfigurationLocationPattern() {
            return componentConfigurationLocationPattern == null ? "/WEB-INF/webx-*.xml"
                    : componentConfigurationLocationPattern;
        }
//找到了配置文件,接下去要解析了,里面实现比较啰嗦,@#¥#@¥@#¥一大堆,返回
 

未完待续......

 

学习了webx3.0和spring mvc如何结果工作,对于定制web mvc有帮助!

 

 

分享到:
评论

相关推荐

    webx3学习的demo,以及留言板的小例子

    学习WebX3的过程中,理解以下几个关键概念非常重要: 1. **XML配置**:WebX3使用XML文件来定义应用的结构,包括页面布局、组件配置、业务逻辑等。 2. **数据源**:连接到数据库,设置数据源是WebX3应用的基础,它...

    webx3文档——web开发

    Webx核心框架的设计理念着重于其初始化过程,包括初始化级联的Spring容器和初始化日志系统。Webx的响应请求机制通过增强request、response、session的功能,并采用Pipeline流程机制来处理请求。异常处理机制和开发...

    WebX3 Guide Book学习指南

    《WebX3 Guide Book学习指南》是一本由Michael Zhou编写的关于Webx框架的专业书籍,出版于2010年11月13日。Webx框架是一个用于构建Web应用程序的强大工具,尤其在Java开发领域中有着广泛的应用。本书旨在为开发者...

    webx3框架指南PDF教程附学习Demo

    3.1. Webx的初始化 ........................................................................................ 24 3.1.1. 初始化级联的Spring容器 .............................................................

    淘宝框架 Webx3资料

    - **WebxFramework**:这部分主要介绍了Webx框架的初始化过程、响应请求的机制以及如何定制WebxFramework等内容。其中,初始化包括Spring容器的级联初始化和日志系统的初始化;响应请求涉及到对HTTP请求的处理流程,...

    Webx3中文指南, 非常详细!

    Webx3中文指南, 非常详细!

    wex框架初始化完全解析.doc

    Webx 框架的初始化是一个非常复杂的过程,它涉及到多个组件之间的交互和协作。通过对 Webx 框架的初始化机制的分析,我们可以更好地理解整个系统的工作机制和结构,从而更好地应用和维护 Webx 框架。

    webx总结 项目实践总结

    每个组件都有自己的生命周期方法,如`init()`和`destroy()`,WebX会按照特定顺序调用这些方法进行初始化和清理。 此外,WebX还会注册Action和Service,这些是处理用户请求的核心部分。Action负责接收HTTP请求,而...

    Webx3_Guide_Book.pdf 用户指南

    Webx3_Guide_Book 用户指南 2001年,阿里巴巴内部开始使用Java Servlet作为WEB服务器端的技术,以取代原先的 Apache HTTPD server和mod_perl的组合。 • 2002年,选择Jakarta Turbine作为WEB框架,并开始在此之上...

    webx3 PDF(阿里巴巴 前端web框架)

    - **初始化级联的Spring容器**:在启动时,Webx会依次初始化一系列嵌套的Spring容器。这一过程确保了框架内部的各个组成部分都能够按需加载并准备好为应用提供服务。 - **初始化日志系统**:日志记录是任何软件开发...

    Webx介绍_PDF

    - **初始化**:Webx3.0的初始化主要由`WebxContextLoaderListener`完成,它负责加载配置文件,并初始化日志系统。 - **执行流程**:请求处理过程通过Pipeline来管理,包括URI解析、请求上下文处理等多个环节,确保了...

    webx框架指南

    WebxFramework部分详细介绍了Webx框架的初始化流程,包括级联Spring容器的初始化和日志系统的初始化。Webx响应请求的过程非常独特,它增强了request、response和session的功能,并通过Pipeline流程机制来处理请求,...

    Webx及框架简介

    学习Webx框架时,建议先了解其基本概念和架构,然后通过实际项目练习来熟悉其API和配置方式。此外,阅读官方文档和社区资源也是快速掌握Webx的关键。最后,对于初学者,可以参考提供的PPT材料,如"Webx及框架简介(1)...

    webx_guide

    Webx的核心是其Webx Framework,它主要负责初始化和响应Web请求。初始化包括设置Spring容器和日志系统,这为后续的请求处理提供了基础支持。Webx Framework能够增强request、response、session的功能,提供了...

    Webx3_Guide_Book.rar_tapeov2_webx_webx 开源框架

    6. **国际化与本地化**:Webx3 支持多语言环境,通过资源配置文件轻松实现应用的国际化和本地化。 7. **错误与异常处理**:Webx3 提供了统一的异常处理机制,可以捕获并优雅地处理运行时错误,提供友好的错误页面。...

    webx

    通过学习WebX框架,开发者可以快速掌握企业级Web应用的开发流程,提高开发效率。对于"petstore-webx3"中的PetStore应用,它可能是WebX的一个示例,展示了如何利用WebX框架搭建一个在线购物系统,包括商品浏览、...

    Webx3日志系统的配置

    《Webx3日志系统配置指南》 在Web开发中,日志系统是不可或缺的一部分,它可以帮助开发者跟踪程序运行状态,定位错误,以及进行性能分析。Webx3是一款功能强大的Web应用框架,其中包含了完善的日志处理机制。本文将...

    Webx3_Guide_Book.pdf

    例如,在WebxFramework章节中,Webx提供了初始化机制,包括初始化级联的Spring容器和日志系统。Webx还支持增强request、response、session的功能,以及通过Pipeline流程机制处理Web请求。 Webx还具备页面驱动的设计...

    Webx3 Guide Book pdf

    ##### **3.1 Webx的初始化** - **初始化级联的Spring容器**:在启动时加载并初始化多个Spring容器,确保各层级之间的依赖关系正确处理。 - **初始化日志系统**:设置日志记录的配置,确保所有日志信息按照统一标准...

    淘宝WEBX框架详解

    通过深入学习WEBX框架,开发者可以更好地理解和实践淘宝的开发流程,从而在实际工作中更快速地适应和产出。 **1. WEBX框架的核心特性** WEBX框架的核心特性包括模块化、面向服务的设计、灵活的数据访问层以及强大...

Global site tag (gtag.js) - Google Analytics