1.mybatis框架(持久层框架)
mybatis是一个优秀的持久层框架,它是对jdbc的操作数据库的过程进行封装,使开发者只需要关注SQL本身,而不需要花费精力去处理例如注册驱动、创建connection、创建statement、手动设置参数、处理集检索等jdbc繁杂的过程代码
mybatis通过xml或注解的方式将要执行的各种statement配置起来,并通过java对象和staement中的sql进行映射生成最终执行的sql语句,最后由mybatis框架执行sql并将结果映射成java对象返回
(封装JDBC,减少重复代码,可以让开发者的精力放在sql语句上,解决JDBC将结果封装为java对象的烦恼)
mybatis运行原理
1.通过输入流获取配置文件的内容信息
2.通过读取的配置信息获取SqlSessionFactory(sql会话工厂)
3.通过工厂获取一个Sqlsession(sql会话—-打开数据库的连接)
4.根据namespace+id定位SQL语句并执行(1.找到指定的mapper.xml文件 2.找到要执行的sql语句 3.执行sql语句 4.指定的类型封装结果 5.将每一条数据封装指定的类型对象中)
5.将返回的结果封装到一个list<指定的封装类型>集合中,并返回
mybatis执行过程
1.将框架中配置文件保存到configuration对象
2.将Configuration作为属性交给DefaultSqlSessionFactory类实例对象
3.由SqlSessionFactory工厂创建一个SqlSession对象
4.SqlSession:(接口)提供开发人员一个接口 作用:用来操作数据库
5.Executor:是一个在SqlSession内部使用接口负责对数据库的具体操作
6.mappedstatement(底层封装工具类)
负责生产具体的sql命令对以及查询结果集的二次封装
为什么要使用mybatis?
在JDBC访问数据库时有大量重复的代码,并且本身并没有连接池,sql语句写死不利于维护,执行sql语句返回的结果需要手动封装
mybatis对JDBC做了封装,简化代码,自身支持连接池,提升效率,将sql语句配置在mapper中,减少耦合,返回的结果自动封装成java对象,省时省力
占位符
{}不需要主动加’’
${}需要加’’
2.Spring框架
Spring是分层的JavaSE及JavaEE应用于全栈的轻量级开源框架,以IoC(控制反转)和AOP(面向切面编程)为核心,提供了表现层SpringMVC和持久层Spring
Spring本质是管理软件中的对象,即创建对象和维护对象之间的关系
Spring优势
1.方便解耦,简化开发
通过Spring提供的Ioc容器,可以将对象间的依赖关系交由Spring进行控制,避免硬编码所造成的过度程序耦合,用户也不必再为较为底层的需求编写代码,可以更专注于上层的应用
2.AOP编程支持
通过Spring的AOP功能,方便进行面向切面的编程,许多不容易使用OOP实现的功能,都可以通过AOP解决
在不修改原代码的情况下给应用系统动态添加一种功能的技术
3.声明式事务支持
通过声明式灵活的进行事务的管理,提高开发效率和质量。
4.方便程序的测试
可以用非容器依赖的编程方式进行几乎所有的测试工作,测试编程随手操作的事请
5.方便继承各种优秀的框架
对各种优秀的框架进行了直接支持
6.降低JavaEE API使用的难度
Spring对JavaEE API进行了薄薄的封装,使这些API的使用难度降低
7.低侵入设计,代码污染基地,独立于各种应用服务器
8.轻量
Spring架构
1.核心容器(Spring Core)核心容器,提供Spring框架的基本功能。核心容器的主要组件是BeanFactory,它是工厂模式的实现。
2.Spring Context Spring上下文,是一个配置文件,向Spring框架提供上下文信息。Spring上下文包括企业服务,例如JNDI、EJB、电子邮件、国际化、校验和调度
3.Spring AOP 通过配置管理特性,Spring AOP模块直接将面向切面的编程的功能集成到了Spring框架中。可以很容易地使Spring框架管理的任何对象支持AOP。比如事务管理服务,通过使用Spring AOP,就可以将声明性事务管理集成到应用程序中
4.Spring DAO JDBC DAO 抽象层提供了有意义的异常层次结构,可以用该结构来管理异常处理和不同 数据库供应商抛出的错误信息,异常层次结构简化了错误处理
5.Spring ORM Spring框架插入若干个ORM框架,从而提供了ORM的对象关系工具。所有这些都遵从Spring的通用事务和DAO异常层次结构
6.Spring Web上下文模块建立在应用程序上下文模块之上,为基于Web的应用程序提供了上下文。Web模块还简化了处理多部分请求以及将请求参数绑定到域对象的工作
7.Spring MVC框架 MVC框架是一个全功能的构建Web应用程序的MVC实现。通过策略接口,MVC框架变成为高度可以配置的,MVC容纳了大量视图技术,其中包括JSP等
程序中的耦合和解耦
什么是耦合?
模块(对象)间联系越多,耦合性越强
对象之间的依赖关系依赖程度越高,耦合度越高,维护成本高
Bean:可重用组件
JavaBean:使用Java语言编写的可重用组件
JavaBean:通常分为业务Bean和实体Bean
业务Bean:处理业务逻辑,service层、dao层
实体Bean:封装数据
IoC控制反转
IOC控制反转,即把创建对象权利交给Spring容器(交给框架),创建、存储、管理都交给Spring容器
Spring容器是Spring中的一个核心模块,用于管理对象,底层可以理解为是一个Map集合
为什么要使用IOC? 为了降低耦合
运行过程简介:
当程序运行,spring开始工作后,会加载整个xml核心文件,读取到
Bean对象的单例和多例概述
Spring容器中管理的Bean对象的作用域,可以通过scope属性或用相关注解指定其作用域。
1.单例模式(singleton)
默认值。这个作用域标识的对象具有全局唯一性
单例负责对象创建、初始化、销毁
2.多例模式(prototype)
多实例。这个作用域标识的对象每次获取都会创建新的对象
多例负责对象的创建、初始化
单例和多例的使用场景或者区别?
在不考虑线程安全下的情况,没必要每次请求都需要创建一个对象,这样浪费cpu和内存
在考虑线程安全的时候,单例的情况下,很容易出现线程并发安全问题
Spring DI依赖注入
Spring依赖注入,即组件之间的依赖关系由容器在应用系统运行期来决定,也就是由容器动态地将某种依赖关系的目标对象实例注入到应用系统中的各个关联组件之中
依赖注入就是在创建对象的同时或之后,如何给对象的属性赋值
Spring提供两种方式为属性赋值
1.Set方式对应着Setter和getter方法,以及toString方法
2.构造方式对应着构造方法注入
3.通过接口实现
Bean工厂
Bean工厂有3个子类但最终实现的类是DefaultListableBeanFactory,多实现是在Spring内部操作对象传递和转化时,对对象访问所做的限制。四个接口共同的定义Bean集合、Bean之间的关系、以及Bean行为
Bean的解析过程非常复杂,主要解析是对于Spring配置文件的解析
Content组件
Context组件给Spring提供一个运行时的环境,用以保存各个对象的状态
ApplicationContext是Context的顶级父类,他处理能表示一个应用环境的基本信息外,他还继承了5个接口,这5个接口用来拓展Context的功能
1.标识一个应用环境
2.利用Bean工厂创建Bean对象
3.保存对象关系表
4.能够捕获各种事件
Core组件
Core作为Spring的核心组件,他其中包含了很多关键类,其中一个重要部分组成就是定义了资源的访问方式
@Resoure接口封装了各种可能的资源类型,这对使用者来说就是屏蔽了文件类型的不同
Resource接口继承了InputStreamSource接口,接口中有getInputStream方法,返回的InputStream类。这样所有的资源都可以通过InputStream这个类来获取,也是屏蔽了提供者
ResourceLoader 接口完成加载,他屏蔽了所有的资源加载者的差异,只需要实现这个接口就可以加载所有的资源,他的默认实现是 DefaultResourceLoader。
Spring运行流程
1.先解析.xml配置文件,把其中
2.执行BeanFactory的后处理器
3.由BeanFactory创建每个类对应的单例对象,利用反射根据类名创建每个类的实例对象
4.执行Bean的后处理器,它其中有两个方法,会在bean的初始化方法前后被调用会把这些结果存入BeanFactory的singletonObjects这样一个map集合里
userService ->userService对象
5.执行依赖注入
6.容器.getBean()根据bean的id,把bean id当做key,进入singletonObjects获取值
解析配置文件获取bean工厂,通过工厂创建每一个类的单例对象利用反射创建每一个类的实例,将其存入一个map集合中,进行依赖注入,根据bean id获取对应的值
Spring MVC框架
MVC设计模式时一种通用的软件编程思想
任何软件分为3部分
1.控制程序流转的控制器(Controller)
2.封装数据处理数据的模型(Model)
3.负责展示数据的视图(view)
保证这三部分互相独立,互不干扰,每部分负责自己擅长的部分
Springmvc是spring框架的一个模块,spring和springmvc无需中间整合层整合
Springmvc是一个基于mvc的web框架
Spring MVC执行原理
1.用户发送请求到前端控制器(DispatcherServlet)
作用:接收请求,调用其他组件处理请求,响应结果,相当于转发器、中央处理器,是整个流程的控制中心
2.前端控制器(DispatcherServlet)收到请求后调用处理器映射器
处理器映射器(HandlerMapping)找到具体的Controller(可以根据xml配置、注解进行查找),并将Controller返回给DispatcherServlet
3.前端控制器(DispatcherServlet)调用处理器适配器
处理器适配器经过适配调用具体的Controller;
(Controller—>servic->Dao->数据库)
Controller执行完成后返回ModelAndView
4.前端控制器(DispatcherServlet)将执行的结果传递个视图解析器
视图解析器根据View解析后返回具体页面
5.前端控制器(DispatcherServlet)根据Model对View进行渲染(将模型数据充填至视图中)
SpringMVC如何进行参数绑定?
底层优先通过set方法,当没有set方法时调用构造方法
详细模式:
2.springmvc 的执行流程
1.所有请求通过匹配 / 路径 进入了 DispathcerServlet
- multipartResolver 是处理文件上传的表单的解析器
- localeResolver 提供了国际化功能
- zh_CN -> 中文提示信息
- en_US -> 美国英语
- handlerMapping 用来处理浏览器的请求路径,对应控制器中哪个方法
- handlerAdapter 用来真正执行,控制器中的方法
- handlerExceptionResolver (异常解析器) 负责处理控制器方法中异常, @ExceptionHandler
- viewNameTranslator 用来解析视图名称, 例如:会把方法的返回结果字符串当成视图名
- viewResolver 视图解析器,将视图名解析为视图对象(例如jsp视图对象)
- 进入 DispathcerServlet 后,会进入 doDispatch 方法,用来执行请求分发
- 进入 handlerMapping 进行路径匹配,路径匹配结束返回 HandlerExecutionChain 执行链
- 执行链里会依次调用 拦截器的 preHandle
- 进入 handlerAdapter, 由它来调用控制器,回到执行链
- 执行链里会反序调用 拦截器的 postHandle
- handlerAdapter 有个返回结果 ModelAndView, 再次回到 doDispatch
- ModelAndView 再被视图解析器解析,获得一个视图对象 View
- View 对象调用 render 方法,负责产生一个响应结果
- 执行链里会反序调用 拦截器的 afterCompletion
- 生成的响应结果,返回给浏览器
Spring MVC的跳转
request对象有两种实现跳转的方式
实现转发
请求转发
return “forward:…”
一次请求一次响应,转发前后的request和response是同一个
并且地址并没有发生改变
重定向
return “redirct:hello”;
二次请求两次响应,转发前后request和response不是同一个对象
地址栏发生了变化Spring MVC响应数据
当请求发起访问Controller中的方法时,可以通过参数声明,在方法内使用Model
Model对象实际上是一个Map集合
