关于java:Spring启动过程

35次阅读

共计 4408 个字符,预计需要花费 12 分钟才能阅读完成。

1、Spring 简介

spring 的最根本的性能就是创建对象及治理这些对象之间的依赖关系,实现低耦合、高内聚。还提供像通用日志记录、性能统计、安全控制、异样解决等面向切面的能力,还能帮咱们治理最头疼的数据库事务,自身提供了一套简略的 JDBC 拜访实现,提供与 第三方数据拜访框架集成(如 Hibernate、JPA),与各种 Java EE 技术整合(如 Java Mail、任务调度等等),提供一套本人的 web 层框架 Spring MVC、而且还能非常简单的与第三方 web 框架集成。从这里咱们能够认为 Spring 是一个超级粘合平台,除了本人提供性能外,还提供粘合其余技术和框架 的能力,从而使咱们能够更自在的抉择到底应用什么技术进行开发。而且不论是 JAVA SE(C/ S 架构)应用程序还是 JAVA EE(B/ S 架构)应用程序都能够应用这个平台进行开发。

2、spring 运行流程

spring 的启动过程其实就是其 IoC 容器的启动过程,对于 web 程序,IoC 容器启动过程即是建设上下文的过程。
首先看 web.xml 中的配置:

<servlet\>

 <servlet-name\>mvc\-dispatcher</servlet-name\>

 <servlet-class\>org.springframework.web.servlet.DispatcherServlet</servlet-class\>

 <load-on-startup\>1</load-on-startup\>

 </servlet\>

 <servlet-mapping\>

 <servlet-name\>mvc\-dispatcher</servlet-name\>

 <url-pattern\>/</url-pattern\>

 </servlet-mapping\>

 <context-param\>

 <param-name\>contextConfigLocation</param-name\>

 <param-value\>/WEB-INF/mvc\-dispatcher-servlet.xml</param-value\>

 </context-param\>

<listener\> <listener-class\>org.springframework.web.context.ContextLoaderListener</listener-class\>

 </listener\>

\================= 剖析 ===========================================

<context-param>

 <param-name>contextConfigLocation</param-name>

 <param-value>/WEB-INF/mvc\-dispatcher-servlet.xml</param-value>

 </context-param>

<listener>      <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>

 </listener>

这段是加载 spring 配置文件,初始化上下文,ContextLoaderListener 是一个实现了 ServletContextListener 接口的监听器,在启动我的项目时会触发 contextInitialized 办法(该办法次要实现 ApplicationContext 对象的创立),在敞开我的项目时会触发 contextDestroyed 办法(该办法会执行 ApplicationContext 清理操作)

①启动我的项目时触发 contextInitialized 办法,该办法就做一件事:通过父类 contextLoader 的 initWebApplicationContext 办法创立 Spring 上下文对象。

②initWebApplicationContext 办法做了三件事:创立 WebApplicationContext;加载对应的 Spring 文件创建外面的 Bean 实例;将 WebApplicationContext 放入 ServletContext(就是 Java Web 的全局变量)中。

③createWebApplicationContext 创立上下文对象,反对用户自定义的 上下文对象,但必须继承自 ConfigurableWebApplicationContext,而 Spring MVC 默认应用 ConfigurableWebApplicationContext 作为 ApplicationContext(它仅仅是一个接口)的实 现。

④configureAndRefreshWebApplicationContext 办法用 于封装 ApplicationContext 数据并且初始化所有相干 Bean 对象。它会从 web.xml 中读取名为 contextConfigLocation 的配置,这就是 spring xml 数据源设置,而后放到 ApplicationContext 中,最初调用传说中的 refresh 办法执行所有 Java 对象的创立。

⑤实现 ApplicationContext 创立之后就是将其放入 ServletContext 中,留神它存储的 key 值常量。

<servlet>

 <servlet-name>mvc\-dispatcher</servlet-name>

 <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

 <load-on-startup>1</load-on-startup>

 </servlet>

 <servlet-mapping>

 <servlet-name>mvc\-dispatcher</servlet-name>

 <url-pattern>/</url-pattern>

 </servlet-mapping>

这段为启动初始化 DispatcherServlet,web.xml 中设置了 Servlet 的 load-on-startup 示意启动容器时初始化该 Servlet。

url-pattern示意哪些申请交给 Spring Web MVC 解决,“/”是用来定义默认 servlet 映射的。也能够如“*.html”示意拦挡所有以 html 为扩展名的申请。

DispatcherServlet 默认应用 WebApplicationContext(ContextLoaderListener 初始化产生)作为上下文,Spring 默认配置文件为“/WEB-INF/[servlet 名字]-servlet.xml”(该名字能够自定义,在 <param-value>)。

DispatcherServlet 也能够配置本人的初始化参数,笼罩默认配置,因而咱们能够通过增加初始化参数

<servlet>

 <servlet-name>chapter2</servlet-name>

<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

 <load-on-startup>1</load-on-startup>

 <init-param>

 <param-name>contextConfigLocation</param-name>

 <param-value>classpath:spring-servlet-config.xml</param-value>

 </init-param>

</servlet>

如果应用如上配置,Spring Web MVC 框架将加载“classpath:spring-servlet-config.xml”来进行初始化上下文而不是“/WEB-INF/[servlet 名字]-servlet.xml”


DispatcherServlet 初始化程序:

(1)HttpServletBean继承 HttpServlet因而在 Web 容器启动时将调用它的 init 办法,该初始化办法的次要作用:将 Servlet 初始化参数(init-param)设置到该组件上(如 contextAttribute、contextClass、namespace、contextConfigLocation),通过 BeanWrapper 简化设值过程,不便后续应用;提供给子类初始化扩大点,initServletBean(),该办法由 FrameworkServlet 笼罩。

(2)FrameworkServlet继承 HttpServletBean通过 initServletBean()进行 Web 上下文初始化,该办法次要笼罩一下两件事件:初始化 web 上下文;提供给子类初始化扩大点。

(3)DispatcherServlet继承 FrameworkServlet,并实现了 onRefresh()办法提供一些前端控制器相干的配置。

整个 DispatcherServlet 初始化的过程和做了些什么事件,具体次要做了如下两件事件:

1、初始化 Spring Web MVC 应用的 Web 上下文,并且指定父容器为 WebApplicationContext(ContextLoaderListener 加载了的根上下文);

2、初始化 DispatcherServlet 应用的策略,如 HandlerMapping、HandlerAdapter 等。

总体概括 spring 的启动过程:

  1. 首先,对于一个 web 利用,其部署在 web 容器中,web 容器提供其一个全局的上下文环境,这个上下文就是 ServletContext,其为前面的 spring IoC 容器提供宿主环境;
  2. 其 次,在 web.xml 中会提供有 contextLoaderListener。在 web 容器启动时,会触发容器初始化事件,此时 contextLoaderListener 会监听到这个事件,其 contextInitialized 办法会被调用,在这个办法中,spring 会初始 化一个启动上下文,这个上下文被称为根上下文,即 WebApplicationContext,这是一个接口类,确切的说,其理论的实现类是 XmlWebApplicationContext。这个就是 spring 的 IoC 容器,其对应的 Bean 定义的配置由 web.xml 中的 context-param 标签指定。在这个 IoC 容器初始化结束后,springWebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE 为属性 Key,将其存储到 ServletContext 中,便于获取;

正文完
 0