【day14 SpringBoot 事务管理+AOP】
1.事务是什么?在MySQL中是怎么去开启,提交,回滚事务的。
在前面的SQL数据库中有学习过,事务是一组操作的集合,要么同时成功,要么同时失败。
在MySQL中开启,提交和回滚分别是:
(1)开启:start transaction;
(2)提交:commit;
(3)回滚:rollback;
2.在Spring中怎么管理事务,用什么注解,在那个层次进行使用可以有效管理事务
Spring中管理事务使用的是@Transactional注解,可以在类,接口,方法上定义,为了有效管理事务,我们一般放在控制成(service层)的方法上。
3.事务管理时规则:如果方法能够正常执行完自动提交事务,如果出现异常自动回滚事物。事务默认识别的异常是运行时异常,如果想要识别到编译时异常从而实现回滚,该怎么操作?
默认识别的是运行时异常,如果要识别编译时异常。有两种方法。
第一种,先将编译时异常使用try....catch 抓住异常,然后再catch里面new一个运行时异常,然后再抛出。
第二种,在@Transactional注解里面,将rollback属性赋值Exception.class。
@Transactional(rollback=Exception.class)
4.事务的传播方式有哪些,含义是怎样?
传播方式有好几种,目前最关注的有两种,一个是REQUIRED以及 REQUERES_NEW。
REQUIRED是默认的传播方式,当有事物时,会加入事务,没有事务时会创建新事物。REQUERES_NEW,不管有没有事务都会创建新事物。
5.AOP叫做什么,有什么作用?举一个5岁孩子就能理解的例子?
AOP叫做面向切面编程,核心思想时将重复的逻辑剥离出来,在不修改源代码的基础上,对原始功能进行增强。
例子:小明的妈妈每天都要做饭,做饭需要买菜,洗菜,切菜,炒菜,最后吃完了还要洗碗。但是小明妈妈每天需要上班没时间去买菜,但是小明奶奶有时间,小明奶奶出去买菜,买完菜后顺便把菜洗好,小明爸爸看小明妈妈每天都很辛苦,就说吃完饭自己洗完。这样小明妈妈,就只需要切菜炒菜就可以了。剩下的,都由小明奶奶和小明爸爸做了。这就是AOP的作用,将本来复杂繁琐的是交给其他人代劳,自己做核心的事情就可以了。本来小明妈妈一个人要完成全部的事情,现在只要切菜和炒菜就可以了,不仅降低了劳动强度,还提高了做事的效率。
6.如果要完成一个AOP的入门案例,需要有哪些步骤?
(1)在pom.xml引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
(2)定义一个类,用于抽取公共代码,并且要有注解@Aspect,用于标识当前类是一个AOP类,在加个注解@Component,让他被Spring容器管理。
(3)再在定义的类上加上一个注解,用于表名配置的公共代码作用于那些目标方法。这里用的注解是@Around,表示环绕通知,在目标方法执行前后执行一些公共代码。
(4)执行测试。
7.AOP的概念理解:连接点,通知,切入点,切面 ?
连接点(JoinPoint):可以被AOP控制的执行方法
通知(Advice):重复的逻辑代码
切入点(PointCut):匹配连接点的条件。
切面(Aspect):整个类(通知+切入点)
8.通知有哪些类型?
有五种类型。
(1)@Around :循环通知,标注的通知方法在目标方法执行前后执行。
(2)@Before:标注的通知方法在目标方法执行前执行。
(3)@After:标注的通知方法在目标方法执行后执行。无论是否有异常。
(4)@AfterReturning:标注的通知方法在目标方法执行后执行,有异常则不执行。
(5)@AfterThrowing:标注的通知方法发生异常后执行。
9.如果有不同切面的通知,增强相同的方法,执行顺序是怎样的?
(1)默认情况是按照字母的排序进行的,通知方法在目标方法前执行的,按字母排序,排在前面的先执行,后面的后执行。通知方法在目标方法后执行执行的按字母排序,在后面的先执行,前面的后执行。
(2)有@Order(数字) 加在切面类上排序的,通知方法在目标方法前执行的,数字小的先执行,通知方法在目标方法后的,数字小的后执行。
10.切点表达式有几种,具体怎么定义?
有两种。第一种execution,放在通知标注的小括号里面。带问号的可以省略。
execution(访问修饰符? 返回值 包名.类名?.方法名(方法参数) throws 异常?)
第二种,使用@annotation。定义一个类是选择Annotation,之后再用@annotation(定义的Annotation全限定名),和execution一样放在通知标注的小括号里面
11.如果有多个通知的切点表达式一样,怎么抽取?
使用@PointCut抽取相容的部分,示例如下:
@Pointcut("execution(* com.itheima.service.impl.DeptServiceImpl.*(..))")
public void pt(){}
@Around("pt()")
public Object recordTime(ProceedingJoinPoint joinPoint) throws Throwable {
}
12.连接点是什么可以获取哪些信息?
连接点理解为目标方法抽象后封装在了连接点里,通过连接点可以得到方法执行时的相关信息,比如方法名,方法实际参数,类型等。
其中@Around通知想要获得连接点的信息智能使用ProceedingJoinPoint,其他四种只能使用JoinPoint。ProceedingJoinPoint是JoinPoint的子类。