`
wlzjdm
  • 浏览: 26503 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Struts2的启动过程源码分析

阅读更多

 

此文重点分析struts启动的时候加载的配置文件信息:

郑重声明:此篇文章完全是自己经过单步调试、及其自己的理解而写的,其中如有错误之处,还请朋友指点。读者在阅读的时候,如果有问题,还建议去自己探究发现、或者与我交流,不能尽信此文。还有部分的信息是参考网上的,在文章最后备注有参考链接。

我们在XML中配置的就是org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter这个类,这个是进入struts构架的入口,也就是它将struts2嵌入嵌入到我们的工作中。

下面是它的初始化函数,当该函数执行完成之后,也就完成了关于struts2的所有的配置文件的加载。

 

public void init(FilterConfig filterConfig) throws ServletException {
		//InitOperations正如所描述的,里面包含了初始化的操作。
        InitOperations init = new InitOperations();
        try {
			//包装FilterConfig的主机配置
            FilterHostConfig config = new FilterHostConfig(filterConfig);
            init.initLogging(config);
			//其实完成各种配置文件的加载就在这个函数中,详情如下面的解析
            Dispatcher dispatcher = init.initDispatcher(config);
            init.initStaticContentLoader(config, dispatcher);

            prepare = new PrepareOperations(filterConfig.getServletContext(), dispatcher);
            execute = new ExecuteOperations(filterConfig.getServletContext(), dispatcher);
			this.excludedPatterns = init.buildExcludedPatternsList(dispatcher);

            postInit(dispatcher, filterConfig);
        } finally {
            init.cleanup();
        }
    }

 

 现在我们一步一步分析initDispatcherconfig)这个函数

 

 

/**
     * Creates and initializes the dispatcher
     */
    public Dispatcher initDispatcher( HostConfig filterConfig ) {
		/*
首先我们了解一个很重要的类:Dispatcher
正如其帮助文档所写的:A utility class the actual dispatcher delegates most of its tasks to. Each instance of the primary dispatcher holds an instance of this dispatcher to be shared for all requests.
这个类的构造方法:
public Dispatcher(ServletContext servletContext, Map<String, String> initParams) {
        this.servletContext = servletContext;
        this.initParams = initParams;
    }
此处就是构造了这样一个派发对象
*/
        Dispatcher dispatcher = createDispatcher(filterConfig);
		
		/*
		下面的这个函数是初始化配置的入口,请直接看下面init函数的解析
*/
        dispatcher.init();
        return dispatcher;
    } 

 

下面的是org.apache.struts2.dispatcher.Dispatcherinit函数    

 /** Load configurations, including both XML and zero-configuration strategies,
     * and update optional settings, including whether to reload configurations and resource files.
     */
    public void init() {
		//配置管理器,当我们加载完配置之后,由此管理器完成对配置的管理
		/*
在com.opensymphony.xwork2.config.ConfigurationManager中有两个列表变量,就是用来存储各种的配置类:
ContainerProvider的介绍:Provides beans and constants/properties for the Container
private List<ContainerProvider> containerProviders = new CopyOnWriteArrayList<ContainerProvider>();
PackageProvider的介绍:Provides configuration packages.  The separate init and loadPackages calls are due to the need to preserve backwards compatibility with the ConfigurationProvider interface
private List<PackageProvider> packageProviders = new CopyOnWriteArrayList<PackageProvider>();
		*/
    	if (configurationManager == null) {
    		configurationManager = createConfigurationManager(BeanSelectionProvider.DEFAULT_BEAN_NAME);
    	}

        try {
			//下面的七步将完成配置文件的加载

			//org/apache/struts2/default.properties文件的加载
//该配置文件由org.apache.struts2.config. DefaultPropertiesProvider加载(重点留意其中的Register函数)
            init_DefaultProperties(); // [1]

			//完成struts-default.xml,struts-plugin.xml,struts.xml的加载
			// com.opensymphony.xwork2.config.providers. XmlConfigurationProvider中的			register函数将完成XML的解析,详细解析方法可参考源代码
            init_TraditionalXmlConfigurations(); // [2]

			//加载自定义的属性文件:struts.properties
            init_LegacyStrutsProperties(); // [3]

			//加载Web.xml中的配置
            init_CustomConfigurationProviders(); // [5]

			//加载Web.xml中的过滤器参数配置
            init_FilterInitParameters() ; // [6]

//将一个BeanSelectionProvider类追加到ConfigurationManager对象内部的
// ConfigurationProvider队列中
// BeanSelectionProvider主要实现加载org/apache/struts2/struts-messages
            init_AliasStandardObjects() ; // [7]
			
//接下来就开始执行配置文件中的init函数和Register函数
//下面的这个函数会转到:
/*
private Container init_PreloadConfiguration() {
		//获取初始化参数,即上面的七步操作结果
        Configuration config = configurationManager.getConfiguration();
		//这个函数中的重点部分也就是这一句了
//下面我们就看看这个函数的内容,由于无法嵌套注释,还是写到下//面吧
        Container container = config.getContainer();

boolean reloadi18n = Boolean.valueOf(container.getInstance(String.class, StrutsConstants.STRUTS_I18N_RELOAD));
        LocalizedTextUtil.setReloadBundles(reloadi18n);

        return container;
    }
*/
            Container container = init_PreloadConfiguration();
            container.inject(this);
            init_CheckConfigurationReloading(container);
            init_CheckWebLogicWorkaround(container);

            if (!dispatcherListeners.isEmpty()) {
                for (DispatcherListener l : dispatcherListeners) {
                    l.dispatcherInitialized(this);
                }
            }
        } catch (Exception ex) {
            if (LOG.isErrorEnabled())
                LOG.error("Dispatcher initialization failed", ex);
            throw new StrutsException(ex);
        }
    } 

此函数位于:com.opensymphony.xwork2.config. ConfigurationManagerpublic synchronized Configuration 中

		getConfiguration(){//此时会去执行else分支
        if (configuration == null) {
            setConfiguration(createConfiguration(defaultFrameworkBeanName));
            try {
                configuration.reloadContainer(getContainerProviders());
            } catch (ConfigurationException e) {
                setConfiguration(null);
                throw new ConfigurationException("Unable to load configuration.", e);
            }
        } else {
			//看看这个函数的内幕:函数比较长,就单只写一个主要的部分吧
			/*
			……
			if (reload) {
            	for (ContainerProvider containerProvider : containerProviders) {
                	try {
                		containerProvider.destroy();
                	}
                	catch(Exception e) {
                      if (LOG.isWarnEnabled()) {
         LOG.warn("error while destroying configuration provider ["+containerProvider+"]",e);
                            }
                	}
                }
				//重点的也就是这个函数了,它会去执行init和register方法
//此处调用的是com.opensymphony.xwork2.config.impl. //DefaultConfiguration中的重写方法
                packageProviders = configuration.reloadContainer(providers);
				过多的代码此处不写了,只看重要部分:
				ContainerProperties props = new ContainerProperties();
     		   ContainerBuilder builder = new ContainerBuilder();
     		   for (final ContainerProvider containerProvider : providers)
     		   {
					//下面两句就是完成初始化和注册操作
       			     containerProvider.init(this);
       		     containerProvider.register(builder, props);
      			}
			……
*/
            conditionalReload();
        }

        return configuration;
    } 

 至此struts的配置都已经加载完成了。

参考链接:

http://blog.csdn.net/ferry_passion/article/details/7110207

 

 

分享到:
评论

相关推荐

    Struts2源码分析

    在深入理解Struts2的工作原理时,源码分析是必不可少的步骤。Struts2的核心设计理念和设计模式相比Struts1.x有了显著的变化,这使得它成为一个独立且成熟的框架。 首先,Struts2的架构基于WebWork的核心,这意味着...

    struts2源代码分析

    ActionProxy是Struts2中的一个重要组件,因为它封装了Action的实例化和调用过程。通过ActionProxy,开发者可以实现更复杂的逻辑,如动态Action映射或延迟加载Action。 Struts2的视图组件被封装在`org.apache.struts...

    struts1.2源码研究

    Struts 1.2 是一款基于 Model-View-Controller(MVC)设计模式的开源Java Web框架,由Apache...通过深入理解Struts 1.2的源码,开发者可以更好地利用这个框架,解决实际项目中的问题,同时为自定义扩展和优化提供可能。

    spring整合struts2 开发源码

    本教程将深入探讨如何将Spring与Struts2进行整合,以及相关的源码分析。 首先,Spring和Struts2的整合主要体现在以下几个方面: 1. **依赖注入**:Spring通过DI机制,将Struts2的Action、拦截器等组件的创建和管理...

    Struts2拦截器原理分析

    1. **初始化**:Struts2框架在启动时会加载所有的拦截器,并调用其`init()`方法进行初始化。 2. **拦截**:当一个请求到达Action时,Struts2会根据配置的拦截器栈顺序,先调用每个拦截器的`intercept()`方法,然后才...

    struts2源码解析,个人感觉很不错

    ### Struts2源码解析及工作原理 #### Struts2简介 Struts2是一个流行的Java Web应用程序框架,它继承和发展了Struts1.x的...对于开发者来说,熟悉Struts2的源码有助于提高开发效率,解决实际开发过程中遇到的问题。

    struts2源码研究

    Struts2 源码分析主要涉及其在Tomcat启动过程中的初始化步骤以及请求处理流程。首先,我们来看Tomcat启动时Struts2框架如何准备和执行。 在Tomcat启动时,Struts2的Filter文件被加载,具体是`...

    手动搭建struts2环境

    对于源码分析和调试,理解Struts2的工作原理和核心组件,如Action、Result、Interceptor、Plug-in等,将有助于提升开发效率和解决问题的能力。 总的来说,手动搭建Struts2环境虽然相对繁琐,但通过这个过程,开发者...

    Struts1.2类库核心源码

    源码分析有助于解决实际问题,提升代码质量和性能,同时也有助于学习MVC模式和其他设计模式的应用。在实际项目中,结合文档和源码,可以更有效地利用Struts1.2提供的功能,为Web应用开发带来便利。

    Struts2入门教程-分析及讲解

    本入门教程将引导初学者深入理解Struts2的核心概念,通过源码分析和实际操作,帮助你快速上手。 1. **Struts2框架概述** Struts2是Struts1的升级版,它弥补了Struts1在灵活性、扩展性和性能上的不足。Struts2采用...

    struts2中,在tomcat启动时候总是出现严重

    在描述中提到的问题是关于Tomcat服务器在启动时遇到与Struts2相关的严重错误。这通常意味着应用的配置或者Struts2的核心组件出现了问题。下面将详细分析可能出现的问题以及解决策略。 首先,当我们在启动Tomcat时...

    GAE Struts2配置

    7. **源码分析**:标签中的“源码”意味着在理解和解决问题时,查看Struts2和GAE相关的源代码可能会有所帮助。了解底层工作原理可以帮助你更好地解决兼容性和性能问题。 8. **工具使用**:可能涉及到的工具包括IDE...

    Struts2应用开发详解02

    在"Struts2应用开发详解02"的主题中,我们将深入探讨Struts2.2的独有特性以及其核心组件之一——StrutsPrepareAndExecute过滤器的源码分析。 首先,让我们来看看Struts2.2的独有特性: 1. **插件化架构**:Struts...

    struts源码解析

    它负责设置全局的配置参数,加载过滤器、初始化插件等,是Struts启动过程的关键部分。 4. **init()方法图.vsd**: VSD(Visio Shapesheet Diagram)文件可能是一个流程图,展示了`init()`方法的执行流程。在Struts...

    struts2学习笔记十一(第11讲.Struts2的核心 拦截器续)

    源码分析** 理解Struts2拦截器的工作原理,可以查看`com.opensymphony.xwork2.DefaultActionInvocation`类中的`invoke()`方法,以及`InterceptorSupport`抽象类中的`doIntercept()`方法。这些源码可以帮助我们深入...

    JSP书店(struts)源码

    通过以上分析,我们可以了解到这个JSP书店系统的基本架构和实现原理,对于学习Java Web开发,特别是Struts框架,这是一个很好的实践案例。在实际应用中,还可以考虑加入Spring、Hibernate等框架,以进一步提升系统的...

    Struts2的整体流程

    Struts2是一个强大的Java web应用程序框架,它遵循MVC(Model-View-Controller)设计模式,简化了开发过程。在Struts2中,整体流程主要涉及三个关键部分:核心控制器FilterDispatcher、业务控制器Action和用户自定义...

    [web工程]集成struts2 mvc

    最后,提供的“demo”文件可能包含了一个简单的Struts2示例工程,你可以解压后运行并分析其结构,以加深对Struts2集成的理解。记得检查`src/main/java`、`src/main/resources`、`WebContent/WEB-INF`等关键目录,看...

    myeclipse+tomcat6.0+struts2开发的登录程序

    标题 "myeclipse+tomcat6.0+struts2开发的登录程序" 提供了我们正在探讨的技术栈,这是一个使用MyEclipse作为集成开发环境(IDE),Tomcat 6.0作为应用服务器,以及Struts2作为MVC框架来构建的登录应用程序。...

Global site tag (gtag.js) - Google Analytics