共计 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 的启动过程:
- 首先,对于一个 web 利用,其部署在 web 容器中,web 容器提供其一个全局的上下文环境,这个上下文就是 ServletContext,其为前面的 spring IoC 容器提供宿主环境;
- 其 次,在 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 中,便于获取;