struts2源码分析1

struts2源码版本2.5.14.1

----------------------------------------------------------------------------------------------------------------------------

从struts2 中的web.xml的启动配置可以看出,首先分析的是FilterDispatcher 这个过滤器类。

过滤器的初始化方法 void init(FilterConfig filterConfig)

struts2源码分析1

init.initLogging()方法,该方法负责初始化struts日志

struts2源码分析1

init.initDispatcher()方法,该方法对dispatcher(分发器)进行了一系列初始化工作。dispatcher里面涉及到很多重要的操作,比如加载配置、创建内部容器、创建及调度Action等等,都是在dispatcher中完成的,所以我们主要关注这个dispatcher。

struts2源码分析1

接着我们看dispatcher的创建过程,createDispatcher()方法。

struts2源码分析1

Dispatcher.Dispatcher()方法。

struts2源码分析1

当前构造了dispatcher的基本对象,接着是对dispatcher初始化,初始化里面做了几件事:

    1.构造了以struts2为基础的配置管理器ConfigurationManager;

    2.向配置管理器加入配置供给器ConfigurationProvider,为内部容器Container构建提供了基础;

    3.创建内部容器,为各个struts2的基础类以及开发人员配置的类提供相关实例的方法,并且提供相关依赖注入的功能;

这里有一个比较重要的类Container,该类提供了struts2的基础类、在配置文件中配置的类的实例化和依赖注入的方法。Container里包含了一个工厂map,里面包含了相关类的内部工厂类InternalFactory,InternalFactory里面有一个create方法,用来创建相关实例。接下来看dispatcher.init()方法。

struts2源码分析1

其中从上到下分别向configurationManager中加入文件管理器的供给器、加入默认配置供给器、加入传统XML配置供给器、加入旧版struts配置供给器(起到兼容作用)、加入自定义的配置供给器、加入Filter初始化参数供给器、加入别名标准对象供给器。具体代码如下:

struts2源码分析1

struts2源码分析1

7个方法中有明显的相似之处:所有初始化的操作都是先创建对应的供应器,并调用addContainerProvider()方法添加到ConfigurationManager中去。从上边代码可以看出struts2对配置文件加载顺序:

    1.org/apache/struts2/default.properties

    2.struts-default.xml

    3.struts-plugin.xml

    4.struts.xml

    5.struts.properties

    6.default.properties

    7.struts.custom.properties

在完成以上操作后,创建Container容器,将以上所有信息全部注入到Container中;container.inject(this)为dispatcher类进行依赖注入;判断是否存在dispatcher监听,如果存在就执行。