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中,便于获取;