Spring-SpringMVC-SpringBoot-Mybatis 关联与重点笔记

2023-02-07 16:29:14

导语:Spring全家桶是现在非常常用的开发首选脚手架,它们能够帮助我们快速的开发一些Web项目等等,那么Spring与SpringMVC、SpringBoot的之间的关联是怎么样的呢?

一个简略的关系图:
在这里插入图片描述
其实,在开发中Spring+SpringMVC就完全可以了,而SpringBoot只是充当了一个集成者,它简化了我们很多步骤。Spring更侧重的是一个概念,SpringMVC更侧重的是开发的一个流程,SpringBoot则更侧重其功能。

SpringBoot

其好处用过的知道,怎么一个妙字了得。现在就记录下其好处:

  • 1、构建项目非常的方便快捷,但它快在哪呢?

    快就快在了pom.xml这个文件,当你创建项目勾选需要的依赖时,它会自动帮你去把相关的一套组合拳全夹杂在一个包里,这样就不用挨着挨着去导入。就是帮我们整合了常用的包,比如tomcat、maven这些都帮我们整合好了的,拿来即用。

  • 2、它内嵌了很多东西,比如Tomcat等。
  • 3、不用再去写繁琐的xml配置文件。

当SpringBoot的项目项目启动时(即通过那个唯一main方法),它会大致去做四件事:

  1. 先去加载你的配置文件
  2. 启动Tomcat
  3. 创建 Spring 容器
  4. 自动扫描 Bean,并将其自动装配到容器里

SpringBoot 自动装备原理(点击跳转


Spring

提到Spring,就会想到大家常说的其两大精髓IOC(控制反转)AOP(面向切面编程)

IOC

可以说,如果没有IOC的话,在项目里创建对象需要我们自己去创建,对象之间的依赖关系需要我们自己去管理。那这样就非常不靠谱,因为这些东西跟一个人的编码水平直接挂钩。当以后需要换掉一些对象时就会非常麻烦,而IOC就做到可插拔的程度,随意更换,会帮你自动管理好。

可插拔呢,就好比在一个业务里,在mapper层时使用的jdbc的技术去实现业务,而公司突然觉得jdbc不好用,想要mybatis去实现实现,而这时如果没有IOC,就需要把以前的代码推到重写;而有了IOC后,就可以再写一个mybatis版的代码,然后把jdbc版上的自动装配的注解(@Repository)一删,把这个注解写在mybatis版上,就可以了。

IOC好处就是把管理Bean的权力交给Spring,由它来统一管理,不让人来管理,这样就不会因为人的技术之分产生一些问题,大大降低了耦合度。

而同时,IOC也管理着Bean的生命周期作用域

管理Bean的生命周期

大致过程如下:

  1. 通过无参构造器或者工厂方法创建bean的实例
  2. 调用set方法给实例的属性赋值
  3. 调用bean的初始化方法
  4. 使用bean
  5. 当IOC容器关闭时,调用bean的销毁方法

管理Bean的作用域:使用@Scope注解就可以管理Bean的作用域了。

  • singleton : 唯一 bean 实例,Spring 中的 bean 默认都是单例的。
  • prototype : 每次请求都会创建一个新的 bean 实例。
  • request : 每一次HTTP请求都会产生一个新的bean,该bean仅在当前HTTP request内有效。
  • session : 每一次HTTP请求都会产生一个新的 bean,该bean仅在当前 HTTP session 内有效。

Spring 中的单例 bean 的线程安全问题了解吗?

的确是存在安全问题的。因为,当多个线程操作同一个对象的时候,对这个对象的成员变量的写操作会存在线程安全问题。

但是,一般情况下,我们常用的 ControllerServiceDao 这些 Bean 是无状态的。无状态的 Bean 不能保存数据,因此是线程安全的。

常见的有 2 种解决办法:

  1. 在类中定义一个 ThreadLocal 成员变量,将需要的可变成员变量保存在 ThreadLocal 中(推荐的一种方式)。
  2. 改变 Bean 的作用域为 “prototype”:每次请求都会创建一个新的 bean 实例,自然不会存在线程安全问题。

ApplicationContext 与 BeanFactory

BeanFactory 是Spring里最底层的API,就是一个管理Bean的工厂,IOC就是通过BeanFactory来管理Bean的,一般供开发Spring框架的人员去使用。

ApplicationContext 是继承于BeanFactory的,是一个子接口,功能更强,可供于使用框架的开发人员去使用。其核心功能就是获取Bean,类上实现一个ApplicationContextAware接口,重写接口的setApplicationContext方法就行了。

AOP(Aspect-Oriented Programming:面向切面编程)

AOP能够将那些与业务无关,却为业务模块所共同调用的逻辑或责任(例如事务处理、日志管理、权限控制等)封装起来,便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可拓展性和可维护性。

AOP是基于动态代理实现的。如果要代理的对象,实现了某个接口,那么Spring AOP会使用JDK Proxy,去创建代理对象,而对于没有实现接口的对象,就无法使用 JDK Proxy 去进行代理了,这时候Spring AOP会使用 Cglib 生成一个被代理对象的子类来作为代理。

@Aspect注解标识配置类,@PointCut注解标识切点,再通过方法标识上时间注解来表示切点生效的时机(比如@Before(“切点的方法名”),@After(“切点的方法名”) …)。
在这里插入图片描述
Spring AOP 和 AspectJ AOP 有什么区别?

Spring AOP 属于运行时增强,而 AspectJ 是编译时增强。 Spring AOP 基于动态代理(Proxying),而 AspectJ 基于字节码操作(Bytecode Manipulation)。

Spring AOP 已经集成了 AspectJ ,AspectJ 应该算的上是 Java 生态系统中最完整的 AOP 框架了。AspectJ 相比于 Spring AOP 功能更加强大,但是 Spring AOP 相对来说更简单,

如果我们的切面比较少,那么两者性能差异不大。但是,当切面太多的话,最好选择 AspectJ ,它比Spring AOP 快很多。

Spring 事务

Spring 事务有两种:编程式事务、声明式事务(推荐使用)。其中声明式事务又分为:①基于XML的声明式事务,②基于注解的声明式事务。

Spring 事务中的隔离级别(有五个):

  • TransactionDefinition.ISOLATION_DEFAULT: 使用后端数据库默认的隔离级别,Mysql 默认采用的 REPEATABLE_READ隔离级别。
  • 其他四个对应着 MySQL 的四个隔离级别。

Spring 事务的传播行为:

支持当前事务的情况:

  • REQUIRED: 如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。
  • SUPPORTS: 如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务的方式继续运行。
  • MANDATORY: 如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常。(mandatory:强制性)

不支持当前事务的情况:

  • REQUIRES_NEW: 创建一个新的事务,如果当前存在事务,则把当前事务挂起。
  • NOT_SUPPORTED: 以非事务方式运行,如果当前存在事务,则把当前事务挂起。
  • NEVER: 以非事务方式运行,如果当前存在事务,则抛出异常。

特殊情况:

  • NESTED: 如果当前存在事务,则创建一个事务作为当前事务的嵌套事务来运行;如果当前没有事务,则该取值等价于REQUIRED

Spring MVC

Spring MVC的工作流程大致如下

  • 1、客户端(浏览器)发送请求,直接请求到 DispatcherServlet。
  • 2、DispatcherServlet 根据请求信息调用 HandlerMapping,解析请求对应的 Handler。
  • 3、然后由 HandlerAdapter 去调用对应的 Conteoller 处理业务。
  • 4、处理完业务后,返回一个 ModelAndVeiw,Model 是返回的数据对象,View 是个逻辑上的 View。
  • 5、ViewResolver 会根据逻辑 View 查找实际的 View。
  • 6、DispaterServlet 把返回的 Model 传给 View(视图渲染)。
  • 7、把 View 返回给请求者(浏览器)
    在这里插入图片描述
    在这里插入图片描述

注意点:当加了@ResponseBody时,就会由HandlerAdapter直接返回给前端了

SpingMVC的配置拦截机制的个点:

  • 1、在调用HandlerAdapter之前拦截
  • 2、在调用HandlerAdapter之后再来一次拦截
  • 3、最后视图返回给DispatcherServlet时拦截

在这里插入图片描述

Mybatis

Mybatis的核心组件SqlSessionFactory,由它来创建SqlSession对象(封装了与数据库的链接),SqlSessionFactory 再通过读取配置文件获取DataSource与 xml 的文件信息给 SqlSession。

Mapper接口(由 MapperScannerConfiguer 扫描)与Mapper.xml一 一对应,Mapper接口它的实现类是在程序运行时,由Mybatis动态创建的,由 MapperProxy 来代理生成对应的实现类(它才是实际被执行的东西,会去间接调用 xml 文件),同时 MapperProxy 也会去调用SqlSession。
在这里插入图片描述

  • 作者:offerNotFound
  • 原文链接:https://blog.csdn.net/weixin_44936189/article/details/115432153
    更新时间:2023-02-07 16:29:14