前言
本系列是自己在学习,工作中的总结与积累,为了记录下自己的知识积累,同时分享给大家
一、优点
- 非侵入式:基于Spring开发的应用中的对象可以不依赖于Spring的API,不需要继承Spring的接口和类,直接通过配置依赖注入就可以使用,非侵入式的代码没有过多的依赖,可以很方便的迁移到其他地方。
- 控制反转:IOC(Inversion of Control),不是什么新技术,是一种设计理念,是指将对象的创建权交给 Spring框架去创建,在未使用Spring的时候,对象的创建都是由我们自己在代码中new创建,而使用 Spring之后。对象的创建都是给了Spring 框架。
IOC对编程带来的最大改变不是从代码上,而是从思想上,发生了“主从换位”的变化,主程序变成被动,不是主动去生成对象,而是被动的等待IOC容器来创建并注入它所需要的资源。
总结:IoC容器帮对象找相应的依赖对象并注入,而不是由对象主动去找,工厂+反射+配置。
这个是没有使用框架时候:
使用容器框架:
- DI(依赖注入) IOC的一个重点是在系统运行中,动态的向某个对象提供它所需要的其他对象,这一点是通过DI(Dependency Injection,依赖注入)来实现的。spring就是通过反射来实现注入的。
例如:对象a中需要使用对象b去操作数据库,没使用框架之前我们是直接去在a中创建b的对象,使用框架后,我们只需要通知spring我们需要b对象,我们自己不用去管理b对象的生命周期和创建过程,spring会在适当的时机创建b对象,注射到A当中,这样就完成了对各个对象之间关系的控制。a要运行就得依赖b,spring完成b的创建,注入到a中,这个就是依赖注入。底层使用的反射原理。 - 面向切面编程:AOP(Aspect Oriented Programming)
- 组件化:Spring 实现了使用简单的组件配置组合成一个复杂的应用,在 Spring 中可以使用XML和Java注解组合这些对象。
二、spring 底层所使用的设计模式
三、spring 执行流程
- 用户向服务器发送请求,请求被Spring 前端控制Servelt DispatcherServlet捕获。
- DispatcherServlet对请求URL进行解析,得到请求资源标识符(URI)。然后根据该URI,调用HandlerMapping获得该Handler配置的所有相关的对象(包括Handler对象以及Handler对象对应的拦截器),最后以HandlerExecutionChain对象的形式返回。
- DispatcherServlet 根据获得的Handler,选择一个合适的HandlerAdapter。(附注:如果成功获得HandlerAdapter后,此时将开始执行拦截器的preHandler(…)方法)。
- 提取Request中的模型数据,填充Handler入参,开始执行Handler(Controller)。 在填充Handler的入参过程中,根据你的配置,Spring将帮你做一些额外的工作:HttpMessageConveter: 将请求消息(如Json、xml等数据)转换成一个对象,将对象转换为指定的响应信息,数据转换:对请求消息进行数据转换。如String转换成Integer、Double等,数据根式化:对请求消息进行数据格式化。 如将字符串转换成格式化数字或格式化日期等,数据验证: 验证数据的有效性(长度、格式等),验证结果存储到BindingResult或Error中。
- 执行处理器Handler(Controller,也叫页面控制器)。
- Handler执行完成后,向DispatcherServlet 返回一个ModelAndView对象。
- 根据返回的ModelAndView,选择一个适合的ViewResolver(必须是已经注册到Spring容器中的ViewResolver)返回给DispatcherServlet。
- ViewResolver 结合Model和View,来渲染视图
- 将渲染结果返回给客户端。