Spring
什么是 Spring 框架?
Spring 是一个轻量级的 IOC 和 AOP 容器框架。是为 Java 应用程序提供基础性服务的一套框架,目的是用于简化企业应用程序的开发,它使得开发者只需要关心业务需求。常见的配置方式有三种:基于 XML 的配置、基于注解的配置、基于 Java 的配置。
主要由以下几个模块组成:
- Spring Core:核心类库,提供 IOC 服务;
- Spring Context:提供框架式的 Bean 访问方式,以及企业级功能(JNDI、定时任务等);
- Spring AOP:AOP 服务;
- Spring DAO:对 JDBC 的抽象,简化了数据访问异常的处理;
- Spring ORM:对现有的 ORM 框架的支持;
- Spring Web:提供了基本的面向 Web 的综合特性,例如多方文件上传;
- Spring MVC:提供面向 Web 应用的 Model-View-Controller 实现。
如何理解 Spring 的 AOP?
AOP 可以说是对OOP的补充和完善。OOP 引入封装、继承和多态性等概念来建立一种对象层次结构,用以模拟公共行为的一个集合。当我们需要为分散的对象引入公共行为的时候,OOP 则显得无能为力。也就是说,OOP 允许你定义从上到下的关系,但并不适合定义从左到右的关系。例如日志功能。日志代码往往水平地散布在所有对象层次中,而与它所散布到的对象的核心功能毫无关系。在 OOP 设计中,它导致了大量代码的重复,而不利于各个模块的重用。
AOP 是面向切面编程, 将程序中的交叉业务逻辑(比如安全,日志,事务等),封装成一个切面,然后注入到目标对象(具体业务逻辑)中去。
AOP 的实现方式
织入:指代码切入到目标函数的过程,例如 aspectJ 到 java 程序的过程称为织入。
静态AOP
在编译期,切面直接以字节码的形式编译到目标字节码文件中。
AspectJ 属于静态 AOP,是在编译时进行增强,会在编译的时候将 AOP 逻辑织入到代码中,需要专有的编译器和织入器。
动态AOP
实现原理是为被代理的业务接口生成代理类,将AOP逻辑写入到代理类中,在运行时动态织入AOP,使用反射执行织入的逻辑。
主要实现方式依赖 java.lang.reflect 包下的 InvocationHandler 和 Proxy 类。
- 优点:Java 标准库原生支持,使用简单,无需引用额外的包。相对于静态 AOP 更灵活。
- 缺点:带代理的类必须是接口,灵活性受到一些限制;使用反射会影响一些性能。
动态代码字节生成
CGLib 是动态代码字节生成的实现,它封装字节码生成工具 Asm,原理是在运行期间目标字节码加载后,生成目标类的子类,将切面逻辑加入到子类中,所以使用 Cglib 实现 AOP 不需要基于接口。
- 优点:没有接口也可以织入,灵活性高。
- 缺点:扩展类的实例方法为 final 时,则无法进行织入。
自定义类加载器
在运行前,目标加载前,将切面逻辑加到目标字节码中。
IOC
在传统的开发模式下,我们都是采用直接 new 一个对象的方式来创建对象,也就是说你依赖的对象直接由你自己控制,但是有了 IOC 容器后,则直接由 IoC 容器来控制。所以“谁控制谁”,当然是 IoC 容器控制对象。
MVC
MVC指MVC模式的某种框架,它强制性的使应用程序的输入、处理和输出分开。使用MVC应用程序被分成三个核心部件:模型、视图、控制器。它们各自处理自己的任务.
Model(模型)用于处理应用程序数据逻辑的部分。通常模型对象负责在数据库中存取数据。
View(视图)处理数据显示的部分。通常视图是依据模型数据创建的。
Controller(控制器)处理用户交互的部分。通常控制器负责从视图读取数据,控制用户输入,并向模型发送数据。它使视图与模型分离开。
Spring MVC
Spring MVC 框架主要由 DispatcherServlet、处理器映射、控制器、视图解析器、视图组成.
Spring MVC 的工作流程如下:
- 客户端请求提交到 DispatcherServlet。
- 由 DispatcherServlet 控制器寻找一个或多个 HandlerMapping,找到处理请求的 Controller。
- DispatcherServlet 将请求提交到 Controller。
- Controller 调用业务逻辑处理后返回 ModelAndView 给 DispatcherServlet。
- DispatcherServlet 寻找一个或多个 ViewResolver 视图解析器,找到 ModelAndView 指定的视图。
- 视图负责将模型结果显示到客户端。
Spring MVC接口
在图 1 中包含 4 个 Spring MVC 接口,即 DispatcherServlet(前端控制器)、HandlerMapping、Controller 和 ViewResolver(视图解析器)。
DispatcherServlet: Spring MVC 所有的请求都经过 DispatcherServlet 来统一分发,在 DispatcherServlet 将请求分发给 Controller 之前需要借助 Spring MVC 提供的 HandlerMapping 定位到具体的 Controller。
HandlerMapping: 接口负责完成客户请求到 Controller 映射。
Controller :处理用户请求。一旦 Controller 处理完用户请求,将返回 ModelAndView 对象给 DispatcherServlet 前端控制器,ModelAndView 中包含了模型(Model)和视图(View)。表示模型应该映射到哪个视图上,但传递的视图名并不直接表示某个特定的JSP,仅仅传递了一个逻辑名称,这个名字将用来查找产生结果的真正视图。DisPatcherServlet将会使用视图解析器来将逻辑视图名匹配微一个特定的视图实现。
从宏观角度考虑,DispatcherServlet 是整个 Web 应用的控制器;从微观考虑,Controller 是单个 Http 请求处理过程中的控制器,而 ModelAndView 是 Http 请求过程中返回的模型(Model)和视图(View)。
ViewResolver(视图解析器):在 Web 应用中负责查找 View 对象,从而将相应结果渲染给客户。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。