> For the complete documentation index, see [llms.txt](https://kk-5.gitbook.io/interview/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://kk-5.gitbook.io/interview/spring.md).

# spring

**springMVC的工作原理**

用户向服务器发送请求,请求被Spring前端控制器Servlet DispatcherServlet捕获;

DispatcherServlet对请求URL进行拦截,根据URL,调用HandlerMapping获得该Handler配置的所有相关的对象(包括Handler以及Handler对象对应的拦截器),

最后HandlerExecutionChain对象的形式返回;

DispatcherServlet根据获得的Handler,选择一个合适的HandlerAdapter(如果成功获得HandlerAdapter后,此时将开始执行拦截器的preHandler(...)方法)

提取Request中的模型数据,根据配置,spring将进行一些额外的工作:

HttpMessageConverter:将请求信息(如JSON,XML数据等)转换成一个对象.将对象转换为指定的响应信息等\
数据转换:如String转为Integer\
数据格式化:对请求信息进行数据格式化.将字符串转换成日期类型\
数据校验:验证数据的有效性.

Handler执行完成后,向DispatcherServlet返回一个ModelAndView对象;

根据返回的ModelAndView,选择一个合适的ViewResolver对象;

ViewResolver结合ModelAndView,渲染视图;

将渲染结果返回客户端;

**spring是如何使用事务的**

pring的事务是通过“声明式事务”的方式对事务进行管理,即在配置文件中进行声明，通过AOP将事务切面切入程序。最大的好处是大大减少了代码量, 等等这类代码不用在每个方法中重复的去写，简化了程序，提高了工作效率。

**springMVC中的controller是默认是单例的？如何保证线程安全**

模式是单例的，只要controller中不存在实例变量就可以保证是安全的，如果需要定义静态数据可以使用prototype定义，不使用单例模式的

**SpringMVC处理流程(**[**http://www.cnblogs.com/hujiapeng/p/5765636.html\\**](http://www.cnblogs.com/hujiapeng/p/5765636.html%29**\\)\*\*

1\)DispatcherServlet前端控制器接收发过来的请求,交给HandlerMapping处理器映射处理

2\)HandlerMapping处理器映射器,根据请求路径找到对应的HandlerAdapter处理器适配器(处理器适配器就是那些对应的拦截器或者是Controller)

3\)HandlerAdapter处理器映射器处理一些功能请求,返回一个ModelAndView对象(包含模型数据,逻辑视图名称)

4\)ViewResolver视图解析器,现根据ModelAndView中设置的View解析对应视图

5\)然后再将Model中的数据映射到View上.

**spring启动过程(**[https://segmentfault.com/q/1010000000210417\\](https://segmentfault.com/q/1010000000210417\)**\\)\*\*

首先web应用部署在容器中,容器提供了一个全局的上下文环境,这个上线问就是SevletContext,通过一个contextLoaderListener调用其 contextInitialized方法,在这个方法中spring会初始化一个启动上下文,WebApplicationContext

然后开始初始化web.xml中配置的servlet.

**spring+mybatis启动过程(**<http://blog.csdn.net/czengze/article/details/52976599\\>**)**
