【一篇搞懂】Spring学习丨黑马程序员(学习笔记)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录


一、前言🚀🚀🚀

在这里插入图片描述

☀️
风是自由的,你也是。


本文简介:本人是大二软件工程专业,java后端方向,学习路线:java基础->JDBC->Maven->MyBatis->SSM,通过做笔记分享到博客上的形式,激励自己学习,同时方便复习。由于水平为入门级别,如有错误,希望大佬们评论或私信斧正 Thanks♪(・ω・))ノ



二、Spring简介及学习路线:☀️☀️☀️

1.初识Spring

1.1 spring全家桶

  下列这三个技术,基本上能够应对我们企业级开发所有的主流开发功能。这套课程我们讲的是Spring Framework,而这个技术是怎么发展过来的:
在这里插入图片描述

1.2 Spring发展史

  Spring1.0 在2004年问世。现在24年已经到Spirng6了。。到了5的时候,spring框架全面支持jdk8,你要想做spring开发,你的jdk版本至少是8及以上。

在这里插入图片描述

2.Spring系统架构

2.1 Spring Framework系统架构

在这里插入图片描述
  每个版本都有新的调整。由于这套课程是22年,当时官网没spring5的架构图,而4的架构也已经稳定成熟,故我们来学习Spring4的架构。
  

在这里插入图片描述

  第一个模块叫核心容器Core Container,这个模块是spring框架中最核心的部分,其他所有模块都是依赖它运行的。看到容器(装对象的),根据这样的一个结构设计来看,spirng是用来管对象的技术。
  第二块叫AOP(面向切面编程),它放在这个位置说明了它要依赖核心容器的执行,跟面向对象编程一样,它也是一种编程的思想,教你程序应该怎么做,又是一种设计型的概念。具体是做什么的呢?它可以在不惊动原始程序的基础上,给它增强功能aspect也是对aop思想进行了实现,spring发现aspect技术做的非常好了,于是大胆地将其收录到它的整个技术栈中(所以后面我们学习spirng的aop开发的时候,除了要导aop坐标,还要导aspect坐标
  第三块,叫做Data Access,在整个数据访问的这个大的模块中,Transactions需要单独介绍(spring在事务这个方面做了非常大的突破,开发起来效率非常高的控制方案。)
  第四块Web开发这方面,这部分内容到后续的spring mvc的课程中再详细学习。
  最下面,test(做测试的) spring在单元测试 (主要学习)和集成测试页给我们提供了一些帮助性的操作。

  

2.2 Spring 学习路线:

  在这里插入图片描述
在这里插入图片描述
  
在这里插入图片描述
  


三、Spring全面学习:☀️☀️☀️

1. 核心概念

1.1 IoC控制反转/DI

引入: 将实现类去掉变成接口
在这里插入图片描述
在这里插入图片描述

  new一个对象直接转为外部(Ioc容器,要管大量的对象,也是前面讲的Core Container)提供对象。

在这里插入图片描述

  现在程序要使用servic对象,IoC可以给你造,但是问题来了,程序运行完,你的service运行完需要Dao,但是你光给我造了个service对象,但是需要Dao才能运行,这两个对象都在IoC容器中,直接把两个bean绑关系。这个过程叫 依赖注入。
(有关系才能绑)

在这里插入图片描述

目标

在这里插入图片描述

(1) IoC入门案例

思路分析
在这里插入图片描述

业务层service: 接口中对应的实现类在数据层。

在这里插入图片描述

数据层dao:
在这里插入图片描述
运行完后两行都能打印出来。

要交给它管理,需要创建个配置文件
  发现没有spring这种结构,原因是还没导包呢,去pom.xml文件导入spring坐标。这里用的是5210的版本,相对稳定了。
在这里插入图片描述

加入dependency标签后,加完坐标,便在maven这里刷新一下便可以。
在这里插入图片描述

在这里插入图片描述

文件创建完后名称叫applicationContext.xml。

在这里插入图片描述

创建一个App2.java文件,获取IoC容器,拿到Dao对象

在这里插入图片描述

这里是运行两行。

在这里插入图片描述

IoC入门案例步骤小总结

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
  


(2) DI入门案例

  1.基于上一个的基础上往下做,基于IoC管理bean。
  2.Service中使用new形式创建的Dao对象是否保留?(否)
  3.Service中需要的Dao对象如何进入带Service中?(提供方法)
  4.Service与Dao间的关系如何描述?(配置)
  
1.2.3步骤
  
在这里插入图片描述  
4.配置
  这里的name名称指的是BookServicelmpl中的bookDao,ref(reference参照对象(参考))是指前边的id=“bookDao”。

在这里插入图片描述
  
DI入门案例步骤小总结

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

  


2. bean配置

2.1 bean基础配置

在这里插入图片描述

问题:bean的id你写好了,但你的命名习惯跟我的不太一样,我想换个名称。
方法:bean的别名,在配置文件xml中可以弄,通过name标签,中间隔空格或逗号分隔。
在这里插入图片描述
在这里插入图片描述

  下图代码运行结果可以看出Spring创建的是单例对象。那要创建非单例的怎么办?要通过配置的形式完成了,我们需要在bean的属性中再加一个属性scope(作用范围),我们不写默认就是singleton,把它换成prototype,再来运行,它会是两个不同的地址,就是不同的对象了。

  
在这里插入图片描述
在这里插入图片描述
  
Spring为什么默认是单例模式?
  为了提高性能,少创建实例,垃圾回收,缓存快速获取,因为要是多例,它会无穷无尽,用一次造一个,而spring在帮我们管理对象的时候,其实就是管理那些可以复用的对象。

在这里插入图片描述
上面那些对象是造一次就OK了,下面那种对象,特征是有状态的对象,它里面会记录成员变量的一些属性值。

那么bean是怎么创建出来的呢?
  


2.2 bean实例化
(1)使用构造方法(常用)

bean本质上就是对象,创建bean使用构造方法完成

现在创建了一个全新的模块
在这里插入图片描述
在这里插入图片描述
配置文件就定义一个bookDao,然后我们的运行程序是这样子:

![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/e98a663780c344f7bac08ed 003577710.png)
在这里插入图片描述

  加一个构造方法再运行一下,再搞个private私有的发现还可以访问到(运行结果一样)然后给该构造方法加个参数int i,发现报错了,说明spring创建bean的时候,调用的是无参的构造方法。这就是第一种实例化bean的方式一一用构造方法实例化对象。

在这里插入图片描述
  
  


这里学个知识点:看spring报错信息:
拉到最后面,看最后的信息,然后再看倒数第二个。
这里就是调用一个有参的构造方法,但是它没有所以就报错了。

在这里插入图片描述

  
小总结
第一种实例化bean的方式:
在这里插入图片描述

  

(2)使用静态工厂实例化bean(了解)

回顾:前面说使用静态工厂也能创建对象?这些年用的少,但早些年用的比较多。
在这里插入图片描述

什么东西都不用动,加这个东西就OK了。

在这里插入图片描述
在这里插入图片描述
发现能正常运行。

在这里插入图片描述

(3)实例工厂实例化bean(了解)

在这里插入图片描述
在这里插入图片描述

小结论:

在这里插入图片描述

(4)FactoryBean实例化bean(务必要掌握)

第三种方法做了个改良,使得在配置的时候更加方便。

在这里插入图片描述

在这里插入图片描述

小结论:
  指定泛型以后,里面所有的类型都要对准这个泛型,配置的时候就跟我们原来的写法一样,注意:配置这里造出来的对象不是FactoryBean的对象,而是上面FactoryBean接口中getObject()造出来的对象。

在这里插入图片描述
  

在这里插入图片描述
  

2.3 bean的生命周期

在这里插入图片描述
这里是新建了一个新案例,结构如下图。.
  在这运行的是Dao,也就是我配置的有Service,有Dao,但是我运行的时候只是拿了DaoService现在并没有参与到这个程序的运行,下面来控制这个Dao对象生命周期。比如说你这个bean前边加载的时候要做一些准备,就可以在这个阶段,另外就是bean消亡之前做一些事情,这里面需要两个操作,来代表它的前或者后,这里定义两个方法
  init方法,其实得按照你的业务来写,比如说初始化的时候加载一些资源获取读取一些文件等等。这里简单点。

在这里插入图片描述
在这里插入图片描述

  把这两方法加上去运行发现是不会执行这两方法的,why?

在这里插入图片描述

  要做配置,在这里改。

在这里插入图片描述

在bean id = bookDao,这里加两个属性,然后再执行,发现只有init操作,但是销毁操作并没有执行,why?

在这里插入图片描述
在这里插入图片描述
  这里我们说一下,我们现在执行的程序是运行在java虚拟机上的, 虚拟机启动了,然后ioc容器加载配置也启动了,然后把bean初始化了,然后我们从里面拿到bean了,执行完了,下一个动作是虚拟机退出了,虚拟机退出没有给你bean销毁的机会。那么怎样才能做到这样呢?
  其实方式有两种,这里简单的介绍,第一种:当你的虚拟机退出之前,我把我的容器给关闭了,那就是ctx.close()就行了(加在代码bookDao.save()后面),但是这里会标红,很遗憾这个ApplicantionContex接口不具有这个方法,但其实在下面这个ClassPathXmlApplicantionContex中是有close方法的。

在这里插入图片描述

这个close方法是从哪来的?是从它上面的父类继承过来的,追到最后是下面这个接口中来的。
在这里插入图片描述

在这里插入图片描述

那么想要在我们的程序中正常关闭bean怎么办,复制这个类,然后粘到前面即可。这种关闭的方式是比较暴力的。

在这里插入图片描述


方法二:
  注册关闭钩子,两者的区别,close关闭相对来说暴力一些,直接关容器,registerShutdownHook则可以放在任意位置。其实这两者在我们实际开发中都不需要写,我们最终做的是web应用,关闭容器这件事是包括TomCat一块的,到后面web那里再说。

在这里插入图片描述

总结

在这里插入图片描述
接口(了解)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
  
在这里插入图片描述
  

2. 依赖注入

2.1 使用setter注入一一引用类型

在这里插入图片描述

在这里插入图片描述

2.2 使用setter注入一一简单类型

这样配applicationContext.xml文件,如下图:

在这里插入图片描述
在这里插入图片描述

2.3使用构造器注入一一简单类型

在这里插入图片描述

在这里插入图片描述

2.4使用构造器注入一一引用类型(了解)

在这里插入图片描述

在这里插入图片描述

2.5 依赖自动装配(功能强大)

在这里插入图片描述

在这里插入图片描述

2.6 集合注入

主要学个格式

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

2.7 案例:数据源对象管理

第三方资源配置管理
我现在管的bean不是我自己写的,别人的。

导入连接池对象。

在这里插入图片描述

  学到这里发现,这里也是出现硬编码的问题,代码也是写死了,如果后期账号密码要修改,还要跑到这里修改代码,维护性有待提高,那么接下来怎么办呢?

在这里插入图片描述
    

2.8 加载properties文件 +开启命名空间方式

以后要是有新的命名空间,基本上都是这个套路。
在这里插入图片描述
  
在这里插入图片描述
  
在这里插入图片描述
  
在这里插入图片描述
  

3. 容器

  
在这里插入图片描述
  

在这里插入图片描述

  
在这里插入图片描述
  

在这里插入图片描述

3. 2 容器、bean、依赖注入相关一一总结

在这里插入图片描述
  

在这里插入图片描述
  

在这里插入图片描述    
  


4.注解开发

前提:从spring2.0开启,提供了各种各样的注解,到了2.5的时候就比较完善了。第一个内容是2.5,到了spring3.0的时候就推出了纯注解开发,也就是我们要讲的第二个内容。

4.1 注解开发定义bean

在这里插入图片描述
  对于我们配置bean来说,两步,第一,在要配置bean上面写上**@Component()可以给它指定名称(这个名称可以理解为ID**)然后在核心配置文件中加上component-scan,到这里bean定义就说完了。
  
在这里插入图片描述
这三个衍射注解的作用:作用其实完全一样,只不过通过不同的注解名称你知道是哪个层的bean。

4.2 纯注解开发

意味着一点配置文件都不写了

在这里插入图片描述
  在这里插入图片描述
在这里插入图片描述
总结
第一使用注解形式怎么定义bean,有这么几点,第一个,@Component是通用的,如果说,你要是做表现层、数据层、应用层开发,建议使用下面这三个,第一个用于不是这三层,有可能是工具类。把它们配上后需要配合组件扫描context:component-scan/才能读取。

  

4.3 注解开发bean作用范围和生命周期

在这里插入图片描述  

在这里插入图片描述

  

4.4 注解开发依赖注入
4.4.1 自动装配

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述


4.4.2 读取properties文件

在这里插入图片描述
  
  回顾以下,@Autowired是解决引用类型注入的,@Qualifier是指定注入的bean的id或者名称,@Value注入我们的简单类型。如果要加载外部的配置文件,用@PropertySource,
在这里插入图片描述
  

4.5 注解开发管理第三方bean

  没有配置,只能用编程写。回到手写代码0.0

在这里插入图片描述
  
在这里插入图片描述

  运行一下App,发现bean已经被创建出来了。

  
在这里插入图片描述
  

在这里插入图片描述
  @bean配置完后,不建议写在SpringConfig类里面,两种方式,第一,使用独立的配置类管理第三方bean后,我们使用导入式,也就是@import来做。如下:

  
在这里插入图片描述

  

在这里插入图片描述
  

在这里插入图片描述
  
简单类型直接数据全都给就行了,引用类型这一块是spring做的比较牛的。它说你给个形参我就内给你数据,到时按类型检测我就给你。
在这里插入图片描述

在这里插入图片描述

  
总结:@Bean以后会经常用到,整合框架必须用到,都不是你自己写的,都是别人写的,所以你肯定得用它。

  

4.5 注解开发总结

在这里插入图片描述
在这里插入图片描述

  
在这里插入图片描述
  

  

5. Spring整合MyBaits开发

5.1 回顾mybatis独立开发

先快速回顾一下Mybatis独立开发是怎么做的, 进入idea中,这里建了一个全新的模块,里边是一套最基本的mybatis操作。
1.先看一下操作的数据库表:

在这里插入图片描述

  1. 与数据库表对应相关的domain里面的Account类,封装数据的。

在这里插入图片描述

3.对应的数据层操作接口(),看到着我们能发现是用注解型,在我们的配置文件中就没有那个映射的.xml文件了。

在这里插入图片描述

4.没有实现类,说明是用自动代理做的。

5.看一下核心配置,加载jdbc配置

在这里插入图片描述

6.这些配置都是比较常规的了,直接下一步看应用程序。

在这里插入图片描述

7.首先前三行是造sqlSessionFactory对象。

在这里插入图片描述

这里分析得出核心对象为SqlSessionFactory,

在这里插入图片描述

  这方框里面数据库连接信息也是为了SqlSessionFactory服务的,而mappers这里是属于我们的业务操作,不属于Mybatis管,所以这一块是伴随着业务改变的。所以到这里应该得出的结论是:mybatis应该管SqlSessionFactory对象。

5.2 Spring整合mybatis
5.2.1 pom文件中加相应坐标

  1.打开pom,我们看看现在有哪些坐标,spring-context核心,然后对于我们后面的这个数据源,我们就用druid数据源了,咱们已经整合过了,再往下,mybatis对应的jar包,这个必定少不了,以及mysql对应的jar包。

在这里插入图片描述

在这里插入图片描述

  那么下面还需要两个包,第一个是 spring操作jdbc 用的包, spring-jdbc ,另一个就是 spring整合mybatis 需要用到的jar包问题:spring跟很多技术整合,那么需要的包是spirng做还是其他技术做呢?(spirng开放出接口标准,你和我整合,你只需要按标准做就行了,等到新技术出现了,它想和spirng整合,按照标准开发即可。)
  这里的version不能乱写,要对应好相应的mybatis版本,

在这里插入图片描述

5.2.2 选用注解开发(准备工作)

  1.创建config.SpringConfig类,做一下数据源,

在这里插入图片描述

第三方bean管理,上面引用的变量值从jdbc.properties中来。

在这里插入图片描述

  @import手动导入,到下面这里就把所有准备工作做完了。

在这里插入图片描述
  

5.2.3 开始mybatis整合

  这里则需要重新建一个类放mybatis的内容。
这里的SqlSessionFactory全部初始化好,既然这些大量的工作都要做,干脆我给你来一个快速创建SqlSessionFactory的东西,叫做SqlSessionFactoryBean,这是个全新的类。

  这个SqlSessionFactoryBean来自于这个org.mybatis.spring包。这是mybatis整合spring的包,也是前面导坐标导的这个东西。

在这里插入图片描述
在这里插入图片描述

我们之前说过但凡是FactoryBean的东西都是造对象,看清楚,它这里实现接口,专门造SqlSessionFactory。这里的getObject()就是返回SqlSessionFactory对象,欧啦。

在这里插入图片描述

在这里插入图片描述

那么这个SqlSessionFactoryBean该怎么做呢?往里面set东西。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

到这里是不是已经整合完了呢???还没有!!!
打开你的配置,来看一下这个,这个 mappers 当我们去 扫描 我们的那个配置最终使用自动代理的形式,帮我们造dao的实现类的。

在这里插入图片描述

MapperScannerConfigurer类对象跟上面一样,直接new一个即可,然后返回这个对象。setBasePackage问你映射在哪个包下。

在这里插入图片描述

到这里mybatis整合就做好了。以后就是把这几行一复制,改两个package路径,然后就做完了。

在这里插入图片描述
原来的这种类就肯定不能要了,写一个全新的运行方式。

在这里插入图片描述

解读:
  
这里getBean注意,不需要拿那个dao,因为我们的dao已经注入到service中了,所以这个直接getBean(AccountService.class)。下面就直接调用findById(),传入一个2,运行完发现OK。到这里其实我们就做完了。

小结
  
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

5.3 Spring整合JUnit

  其实就是基于spring环境,我们把测试给搞出来。下面我们做的就是text模块下面的测试。
1.创建一个测试类AccountServiceText,测业务层接口(比较多,当然也可以测数据层接口),如果要想让它成为一个测试用例,那必须要到junit包,

在这里插入图片描述

导完坐标后刷新一下功能。

在这里插入图片描述

整合: @RunWith(),设定类运行器,这是Spring整合junit的专用运行器。
@ContexConfiguration 配置.
先定义一个业务层接口,要想保证这里能用它,@Autowired。
下面顺便写一个测试方法,顺便跳,这里写testFindId,

在这里插入图片描述在这里插入图片描述

  
在这里插入图片描述
  

6. AOP

6.1 AOP简介
6.1.1 AOP核心概念

我们说过spring有两大特征,一个是ioc,应该是aop。

在这里插入图片描述

在这里插入图片描述

6.1.2 AOP作用

代码不变的基础下增强功能

在这里插入图片描述
在这里插入图片描述

  

6.1 AOP入门案例

  
开发有两种模式:XML or 注解,这里是用注解的模式,效率 高。

在这里插入图片描述

  
导包这里,aop的坐标除了aop以外,还要导aspectj。

在这里插入图片描述
  

在这里插入图片描述

  
在这里插入图片描述

  
第四步:这里表明当执行到这个方法的时候,这就是一个切入点

在这里插入图片描述

这里的关系就叫切面。绑定切入点通知关系,@Before()。

在这里插入图片描述
  

第六步: 这里解读下面整篇代码
①@Component:告诉spring来加载我
②加个这@Aspect,告诉spring,这个东西是用来做AOP的。
③@Pointcut,定义好你的切入点。
④public void before(){} 定义好你的通知。
⑤@Before(),把切入点和通知绑定好,就OK了。

在这里插入图片描述

第七步:加入@EnableAsepctJAutoProxy,告诉spring我这里有用注解开发AOP,换句话说,这句话启动了我们配置里面的@Aspect,而这句话则告诉你,你进去识别类里面的内容。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

6.2 AOP工作流程

在这里插入图片描述

上面的代码:这里读取第二个切入点,因为它下面@Before配置了第二个切入点。

在这里插入图片描述

选的切入点是否能跟类中的某个方法配上。

spring的aop模式就是代理模式做的,AOP的整个工作,实际上就是用了代理模式。

在这里插入图片描述

在这里插入图片描述

  

6.3 AOP切入点表达式

这里的表达式是指写一句话来表达这个方法。

在这里插入图片描述

在这里插入图片描述

返回值,包,接口,方法.
这里的疑问,一个程序中要是有很多功能,然后你挨个写切入点表达式,不得把你写死?怎么办勒?往下看。一一>通配符,在AOP中,描述切入点可以使用通配符,加速配置,加速描述。

在这里插入图片描述

在这里插入图片描述

  
在这里插入图片描述

  
在这里插入图片描述

  

6.4 AOP通知类型

  上一节,咱们研究的是切入点表达式,就是控制给谁加AOP,这一节我们研究的更详细一点,也就是AOP的控制类型。这一节中,我们要介绍几种不同的控制类型。

在这里插入图片描述

前置通知

在这里插入图片描述

  环绕通知,这里我们想让两条语句加在原先的前后,但是这里增强不要紧,直接把我原始操作给隔离了,因为我们在这是做环绕通知,环绕的话肯定是在原始操作的前或后,这里必须有一句话表示对原始操作调用格式非常固定。这里pjp.proceed(); 这句话表示对原始操作的调用。

在这里插入图片描述

在这里插入图片描述

小总结:

  不想用原始操作,可以用Around方法注解进行隔离。有什么用呢,比如说你可以做一些权限校验,你呢现在想要运行我的方法,你必须得是一个经理的权限,那好我拿过来看看你是不是经理,如果是,那好你执行,如果不是那这个操作不允许你执行。
这里的例子其实听着有点小萌比,等以后再过来看看这一块。

这里应该就能稍微想明白,怎样对原始操作隔离,以及为什么出现隔离这种效果
就是我不想让你调原始操作

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

  

6.4 案例:测量业务层接口执行万次执行效率

  这一节我们就要结合前面所学的AOP切入点怎么配,AOP切入类型怎么设来做一个案例。做的就是我们学习AOP做的第一个案例,叫做测量业务层接口执行万次执行效率。
在这里插入图片描述

这样的操作还是有点问题的,区分不了是谁。于是。

在这里插入图片描述

在这里插入图片描述

6.5 AOP通知获取数据

  
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

6.6 案例:百度网盘密码数据兼容处理

在这里插入图片描述

  就是这里要求输入五位,然后这里四位,百度的服务器里面会不会在密码里面自动给你们加一个空格? 不会啊。。 所以在很多网站上面,当用户输入信息后,空格都要处理一下。

写个AOP数据处理类:

在这里插入图片描述

在这里插入图片描述
  第一:获得参数, 第二:遍历参数以后,先去看看你这个是否要参与状况,如果转化的话,trim完了换回那个位置。最后的话调原始操作,不要忘了把原来那个参数加过来。
  咱们就通过一个案例体会一下AOP在我们实际开发中的作用,说的简单点就是,如果你有一些相同的大量使用的数据, 需要在很多地方加的话,AOP一定是你的不二选择,使用AOP可以简化你的共性功能开发

6.7 AOP总结

  AOP是一种编程范式,是指导我们软件如何开发设计的。

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

7. Spring事务

7.1 Spring事务是怎么做的

在这里插入图片描述

事务本身的作用就是为了保证我们数据库操作的一致性。(操作执行同时成功或失败)

在这里插入图片描述

  spring给出了一个最基本的事务管理器实现,这是一个实现类DataSourceTransactionManager,就是你给我对应的dataSource后,我就能够帮你在业务层开事务,但是它的内部是用jdbc的事务,你现在用的技术是jdbc技术,就可以用它这个事务管理器的实现对象,很巧合的是,我们Mybatis内部就是jdbc事务,所以后面我们spring整合mybatis,如果要使用spring的事务,就用这个实现就行。

  
在这里插入图片描述
在这里插入图片描述

  1. 先看一下我们数据库的表,就这么一组数据。
  2. 在这里插入图片描述

在这里插入图片描述

  程序中,首先,转账接口,把你要转账的两个账户给我,把金额给我,就可以进行转账。而数据层接口,是两个操作,一个是进钱,一个是出钱。最后我们通过测试用例,测试结果。

在这里插入图片描述
  要想把spring事务开了,怎么做呢,
第一步:加注解@Transaction,这注解通常不写实现类上,大部分情况写在接口上。

第二步是到我们的配置中,配置一个spring事务管理器, 如下图:

在这里插入图片描述

  第三步:你在接口上开了这个东西,但是spring还不知道以事务注解的形式做事务,所以第三步要到spirng配置文件中告诉spring我们现在是用注解形式做事务了。
如下图: 加入@EnableTransactionManagement

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

  

7.2 Spring事务角色

在这里插入图片描述

这两个操作分别对应的数据层操作。

在这里插入图片描述

  而在transfer类前加个**@Transactional代表着开启事务**。一旦开启后,是不是意味着一共有三个事务,那现在三个谁都不挨谁阿,于是spirng就做了一件事,你们两个事务既然都在我的控制范围内,你们这两个事务都改成和我一样的事务,全都加到我的事务中。
  现在我们的整体操作就只有一个事务了,正因为只有一个事务,所以在它的范围内,一旦出现了异常,它就会将事务回滚,就可以做到所有操作同时执行或同时不执行。
  进行一下划分,我们将spring开启的这个事务叫做事务管理员,我们将加入到spring事务中的这个成员叫做事务协调员

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

7.3 Spring事务属性

在这里插入图片描述

要在数据库进行留痕

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  
在这里插入图片描述

这里就要改一下了,不仅要调用out,inMoney这两个操作,这里边要调用我们两个事务,

在这里插入图片描述
在这里插入图片描述

到这呢,这段程序算是写完了。

在这里插入图片描述
在这里插入图片描述

  

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

事务传播行为的所有情况。

在这里插入图片描述

  

四、总结:🍓🍓🍓

碎碎念:
  现在是2024.5.28凌晨0:36,终于把spirng这一块学完了,由于时间有点赶,这里就暂时不做什么多的总结了,先小结一下spring,刚开始对spring以为就是一种技术,很容易上手,但实则spring包含很多东西,它不仅仅是一个框架,它有Ioc控制反转(解决代码高耦合,不用new对象了,让外部提供对象)、DI 依赖注入 (这个也是学spring后才发现的一个重点内容),bean(对象)配置,到后面的纯注解开发(发现可以不用谢配置文件),原来一路学下来,有挺多技术都是不怎么用的,但是之所以要学它是因为新技术在学它的基础上更好理解和应用(个人想法以后可能会有些许变化)。大概就先概述这么多吧,晚安~
                                           一一2024/5/28

Alt

  • 31
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值