SSM(Springmvc Spring MyBatis)框架理解

1、Spring的DI和AOP

1.1 定义

DI定义:DI(Dependency Injection)依赖注入,指容器复制创建和维护对象之间的依赖关系,实现了不同业务层之间的低耦合。

AOP定义:AOP(Aspect Oriented Programming)面向切面编程,可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术。

1.2原理

1.2.1 DI原理:
(1)从这段配置说起
每一个整合spring框架的项目中,总是要在web.xml中加入这样一段配置。
在这里插入图片描述

(2)ContextLoaderListener的作用是什么?
分解下这个单词:
Context:译为“上下文”说明他干的事是全局性的,整个项目都能用。
Loader: 译为“加载器”类的加载器可以用于生成对象。
Listener:译为“监听器”JavaWeb三大组件之一,监听三大域对象的生命周期活动。
ContextLoaderListener的作用就是启动Web服务器时,当监听到ServletContext域对象创建,触发监听任务去解析spring配置文件,生成WebApplicationContext对象(可理解为通过DOM4J+反射技术生成的所有配置Bean对象的集合),然后将这个对象放置在ServletContext的属性里,方便全局调用。
简单来说,就是上面这段配置为项目提供了spring支持,初始化了IOC容器。

现象:
(1)为什么修改配置文件要重启项目呢?
以spring配置文件为例,ServletContext是服务器启动时创建,所以重启可以再触发监听重新初始化IOC容器。
(2)spring框架生成的对象为什么默认是单例的?
IOC容器内的对象是在初始化时一次性创建的。

1.2.2 AOP原理:
SpringAOP使用了两种代理机制,一种是基于JDK的动态代理,另一种是基于CGLib的动态代理,这里主要说基于JDK的动态代理。

JDK的动态代理:
在这里插入图片描述
上图 JDK动态代理的核心代码

逆向思维:
目的—>生成代理对象—>代理对象作用是执行调用者定义的方法(这不就是InvocationHandler的invoke方法嘛!)—>要生成这样的代理对象在JAVA中需要CLASS文件。
所以JDK的动态代理做了两件事:
1、使用target.getClass().getClassLoader()和target.getClass().getInterfaces()这两个参数的值动态拼凑出一个新的Class对象,即代理对象的Class文件。
2、通过代理对象的构造方法将InvocationHandler对象的invoke方法传递到待加强的方法中。
通过源码再看下这两步:
1、进入Proxy.newProxyInstance()方法,查看如何生成代理对象的Class文件。
在这里插入图片描述
有了这个class文件对象再利用反射技术就可以返回代理对象了,反编译看下这个cl对象的结构。
反编译后的简化结构如下
在这里插入图片描述
2、查看如何传入InvocationHandler对象
在这里插入图片描述
至此返回的代理对象已经被增强。
而SpringAOP动态代理的也是类似的配置,只是对象的生成结合了DI的方式自动生成。通过配置文件的参数就可以隐隐的感受到… …
在这里插入图片描述

2、SpringMVC原理

在这里插入图片描述
2.1 SpringMVC流程:

1、 用户发送请求至前端控制器DispatcherServlet(配置在web.xml中)。
2、 DispatcherServlet收到请求调用HandlerMapping处理器映射器。
3、 处理器映射器找到具体的处理器(注解配置为例:具体过程就是比对url参数与 @requestMapping参数是否一致,一致则找到处理器),生成处理器对象和拦截器链 (如果有则生成)一并返回给DispatcherServlet。
4、 DispatcherServlet调用HandlerAdapter处理器适配器。
5、 HandlerAdapter经过适配调用具体的处理器(Controller,也叫后端控制器)。
6、 Controller执行完成返回ModelAndView(Model是数据,View是具体页面地址)。
7、 HandlerAdapter将controller执行结果ModelAndView返回给 DispatcherServlet。
8、 DispatcherServlet将ModelAndView传给ViewReslover视图解析器。
9、 ViewReslover解析后返回具体View(因为视图可能是JSP或FreeMarker或其他所以要找对应的解析器)。
10、DispatcherServlet根据View进行渲染视图(即将模型数据填充至视图中)。
11、DispatcherServlet响应用户。

2.2拦截器和过滤器的区别:

过滤器:是Servlet规范中定义的,从接口方面来说这个规范定义了 Servlet 、Filter 、Listener 等接口,他们的生命周期方法只能由 Tomcat 等具体WEB容器才能调用,应用程序是不能调用,就是说过滤器是设计之初就定义好的JavaWEB组件。这些组件的使用都要在服务器的web.xml中进行配置。

拦截器:是框架对AOP编程思想的一种实现,它提供了一种机制可以使开发者可以在一个action前后执行代码。

知道了这些可以更容易理解一下区别:
1、过滤器依赖与servlet容器(容器必备组件),而拦截器不依赖与servlet容器(AOP思想的实现)。
2、过滤器可以对几乎所有的请求起作用,拦截器只能对action请求起作用。
3、过滤器不能访问action上下文、值栈里的对象,而拦截器可以。
4、过滤器只能在容器初始化时被调用一次,拦截器可以多次被调用。

3、MyBatis原理

3.1JDBC的不足

在这里插入图片描述
1、连接处理
问题描述:
数据库连接频繁的开启和关闭本身就造成了资源的浪费,影响系统的性能。
解决问题:
数据库连接的获取和关闭我们可以使用数据库连接池来解决资源浪费的问题。通过连接池就可以反复利用已经建立的连接去访问数据库了。减少连接的开启和关闭的时间。
2、SQL处理
问题描述:
SQL语句基本都散落在各个DAO中,也无法实现根据传入参数动态改变SQL语句,不利于维护。
解决问题:
我们可以将这些SQL语句统一集中放到配置文件,利用类似JSTL标签的方式传入参数,根据参数的布尔判断来拼装SQL,然后通过SQL语句的key值去获取对应的SQL语句。
3、结果处理
问题描述:
执行SQL语句后,返回的是一个ResultSet结果集,如果能封装起来,每个数据库操作都不用自己写那么一大堆Java代码,直接调用一个封装的方法就可以搞定了。
解决问题:
想法是设计一个SQL处理器,SQL处理器要有两点:第一,需要知道要返回什么类型的对象;第二,需要返回的对象的数据结构能跟执行的结果映射,这样才能将具体的值copy到对应的数据结构上。

3.2MyBatis结构

在这里插入图片描述
调用者获取sqlSession对象操作即可:

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值