学习笔记之Spring知识点小总结

**

记录一些个人经常忘的Spring知识

**
1、首先几个重要的概念:

Spring:就是一个容器,里面放着各种各样的资源
DI(dependency injection):依赖注入,IOC 的另一种表述方式:即组件以一些预先定义好的方式(例如: setter 方法)接受来自如容器的资源注入.   
AOP(Aspect-Oriented Programming):面向切面编程
IOC(Inversion of Control):简单翻译就是控制反转,将传统的资源获取方式改变,传统模式都是我需要什么资源,再去查找,而现在是将所有的资源放在一个容器中,当我们需要用到时候,则去获取,去容器里面挑选

2、Bean的作用域

①Spring 中, 可以在 元素的 scope 属性里设置 Bean 的作用域.
②默认情况下, Spring 只为每个在 IOC 容器里声明的 Bean 创建唯一一个实例, 整个 IOC 容器范围内都能共享该实例:所有后续的 getBean() 调用和 Bean 引用都将返回这个唯一的 Bean 实例.该作用域被称为 singleton, 它是所有 Bean 的默认作用域.
这里写图片描述

3、引入外部资源文件–比如引入数据库配置文件

<context:property-placeholder location="classpath:db.properties"/>

4、AOP

面向切面编程,简单来说一刀切,将需要添加其他代码的方法一刀切出来,然后通过在切面上添加共同的代码,类似于抽取代码一般
Spring使用两种代理来实现,一种是基于JDK的动态代理,一种是cglib的动态代理,两者的区别就在于JDK的动态代理是基于接口的,没有接口会报类型转换异常错误,cglib则不需要接口,原理是用asm(就是一个字节码框架,具体是什么,怎么用,我也没了解过。。。)来实现的,基于字节码来实现

①切面(Aspect): 横切关注点(跨越应用程序多个模块的功能)被模块化的特殊对象
②通知(Advice): 切面必须要完成的工作
③目标(Target): 被通知的对象
④代理(Proxy): 向目标对象应用通知之后创建的对象
⑤连接点(Joinpoint):程序执行的某个特定位置:如类某个方法调用前、调用后、方法抛出异常后等。连⑥接点由两个信息确定:方法表示的程序执行点;相对点表示的方位。例如 ArithmethicCalculator#add() ⑦方法执行前的连接点,执行点为 ArithmethicCalculator#add(); 方位为该方法执行前的位置
⑧切点(pointcut):类似于查询条件一般,可以根据这个切点(条件)来指定类,对符合该条件的类来进行操作,表达式(* . (..)) 下面是切点的演示案例,基于合并切点表达式
这里写图片描述

AspectJ 支持 5 种类型的通知注解:
@Before: 前置通知, 在方法执行之前执行
这里写图片描述
@After: 后置通知, 在方法执行之后执行
这里写图片描述
@AfterReturning: 返回通知, 在方法返回结果之后执行
这里写图片描述
如果想操作返回的值,可以用下面的操作
这里写图片描述
@AfterThrowing: 异常通知, 在方法抛出异常之后
可以指定具体的异常类型,也可以使用超类Throwable,看个人情况
这里写图片描述
@Around: 环绕通知, 围绕着方法执行
这里写图片描述

指定切面的优先级,可以使用注解@Order(n) n越小优先级越高

5、Spring中的事务
ACID
原子性(atomicity): 事务是一个原子操作, 由一系列动作组成. 事务的原子性确保动作要么全部完成要么完全不起作用.
一致性(consistency): 一旦所有事务动作完成, 事务就被提交. 数据和资源就处于一种满足业务规则的一致性状态中.
隔离性(isolation): 可能有许多事务会同时处理相同的数据, 因此每个事物都应该与其他事务隔离开来, 防止数据损坏.
持久性(durability): 一旦事务完成, 无论发生什么系统错误, 它的结果都不应该受到影响. 通常情况下, 事务的结果被写到持久化存储器中

声明式事务管理(简单来说,就是你通过注解的方式或者XML方式声明他需要事务,然后指定其他属性,比如隔离级别,超时时间。。。,然后Spring就可以给你加上事务了,表示这段代码是有事务管理的)

注解方式:
在所需要加事务的方法或者类上面加上注解@Transactional
有以下其中,反正就用第一种就可以了(默认就是第一种),后面的几种 根据业务需求再慢慢选择
这里写图片描述

并发事务导致的问题–脏读 不可重复读 幻读

脏读: 存在两个事务AB,两个事务AB均开启,A事务修改数据后,B事务在读取,能读取到A事务修改的数据,且此时事务AB均未提交,这就是脏读。简单来说,就是未提交事务之间可以读取到彼此之间事务修改的数据
不可重复读:同上,有两个事务AB,A事务开启,修改其中一条数据,B事务开启修改一条数据且提交事务,此时A事务再次读取的时候,就能读取到B事务修改的数据,这就是不可重复读
幻读:同上,有两个事务AB,A事务开启,修改其中一条数据,B事务开启增加或者删除一条数据且提交事务,此时A事务再次读取的时候,就能读取到B事务增加或删除的数据,这就是幻读
幻读和不可重复读容易混淆,其最关键的地方,就在于不可重复读侧重于修改数据,而幻读侧重于增加或者删除数据

事务的隔离级别

事务的隔离级别要得到底层数据库引擎的支持, 而不是应用程序或者框架的支持.
Oracle 支持的 2 种事务隔离级别:READ_COMMITED , SERIALIZABLE
Mysql 支持 4 中事务隔离级别.

设置隔离级别的属性
1、注解方式
这里写图片描述
2、xml方式
这里写图片描述

设置回滚事务属性
默认情况下只有未检查异常(RuntimeException和Error类型的异常)会导致事务回滚. 而受检查异常不会.

事务的回滚规则可以通过 @Transactional 注解的 rollbackFor 和 noRollbackFor 属性来定义. 这两个属性被声明为 Class[] 类型的, 因此可以为这两个属性指定多个异常类.
rollbackFor: 遇到时必须进行回滚
noRollbackFor: 一组异常类,遇到时必须不回滚
这里写图片描述

多种异常还可以使用逗号隔开
这里写图片描述

超时事务属性: 事务在强制回滚之前可以保持多久. 这样可以防止长期运行的事务占用资源.
只读事务属性: 表示这个事务只读取数据但不更新数据, 这样可以帮助数据库引擎优化事务.
还有一种就是声明式的事务管理,说白了就是跟AOP一样,需要指定哪个方法加上事务,所以就需要在xml文件中配置上对应的表达式,就相当于查询条件一般,把他给筛选出来,然后给它加上对应的事务

这里写图片描述

以上,是本人所总结的一些自己经常忘记的知识点,也有可能存在错误,欢迎指出,后续讨论过后会纠正。谢谢!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值