1. 事务是什么?在MySQL中是怎么去开启,提交,回滚事务的。
事务是一组操作的集合,要么全部执行成功,要么全部执行失败
MySQL中:
开启事务:start transaction / begin
提交事务:commit
回滚事务:rollback
2. 在Spring中怎么管理事务,用什么注解,在那个层次进行使用可以有效管理事务
@Transactional
在service层可以有效管理事务 定义在方法上,类上,接口上
3. 事务管理时规则:如果方法能够正常执行完自动提交事务,如果出现异常自动回滚事物。事务默认识别的异常是运行时异常,如果想要识别到编译时异常从而实现回滚,该怎么操作?
两种方案:
方案一 :定义:@Transactional(rollbackFor=Exception.class) 然后throws 抛出异常
方案二 :try catch 捕获异常 转换为运行时异常后后再抛出
4. 事务的传播方式有哪些,含义是怎样?
常用的传播方式有两种:
一:REQUIRED (默认值)需要事务,有则加入,无则创建新事务。大部分情况下用该传播行为
二:REQUIRS_NEW 需要新事务,无论有无,总是创建新事务。不希望事务之间相互影响时使用该传播行为,比如删除部门前要先删除该部门下的员工,不论部门是否删除,该部门下的员工一定会删除成功。
5. AOP叫做什么,有什么作用?
AOP:面向切面编程
减少代码冗余,提高代码复用性,提高开发效率
6. 如果要完成一个AOP的入门案例,需要有哪些步骤?
一:pom.xml引入依赖
二:定义一个切面类,抽取重复代码
三:用@Aspect,@Component标识当前类是一个AOP类并被Spring容器管理
四:配置公共代码(重复代码)作用于哪些目标方法
五:执行目标方法
六:测试运行
7. AOP的概念理解:连接点,通知,切入点,切面 ?
连接点: joinPoint 要执行的目标方法(类里面哪些方法可以被增强)
通知(增强):Advice 重复的逻辑代码(实际增强的逻辑部分称为通知)
切入点: PointCut @Around 定义的表达式 (连接点的条件)(实际被真正增强的方法)
切面:Advice通知+切入点,整个类(把通知应用到切入点过程)
8. 通知有哪些类型?
前置通知 @Before:
此注解标注的通知方法在目标方法前被执行
环绕通知 @Around :
此注解标注的通知方法在目标方法前、后都被执行
后置通知 @AfterReturning:
此注解标注的通知方法在目标方法后被执行,有异常不会执行
异常通知 @AfterThrowing:
此注解标注的通知方法发生异常后执行
最终通知 @After:
此注解标注的通知方法在目标方法后被执行,无论是否有异常
9. 如果有不同切面的通知,增强相同的方法,执行顺序是怎样的?
一:按照bean类的名称字母排序
二:用@order(数字)加在切面上控制顺序
目标前的通知方法:数字小先执行
目标后的通知方法:数字小后执行
10. 切点表达式有几种,具体怎么定义?
一:execution(返回值类型 包名.类名.方法名(参数类型))
- * 可以通配任意返回值类型、包名、类名、方法名、或任意类型的一个参数
- .. 可以通配任意层级的包、或任意类型、任意个数的参数
execution(* com.itheima.service.impl.*.*(..))
如:在切面的方法上加@Before("execution(* com.itheima.service.impl.DeptServiceImpl.*(..))")
二:annoation()根据标记的 注解匹配
定义一个随意一个@...的标记类 如@Flag,
类上设置@Target(ElementType METHOD)目标作用范围 方法
@Retention(RetentionPolicy.RUNTIME)生命周期
在切面的方法上加 @Before("annotation(com.itheima.aop.Flog)")
在目标方法加@Flag标记性注解
annotation(com.itheima.aop.Flog)
如:@Before("annotation(com.itheima.aop.Flog)")
11. 如果有多个通知的切点表达式一样,怎么抽取?
@PointCut
在切面定义一个方法,抽取共性的(重复的)切点表达式如:
12. 连接点是什么,可以获取哪些信息?
连接点:目标方法 或 要增强的方法 可以被拦截的方法都叫做连接点
可以获取:
A. 获取拦截的类名
B. 获取拦截的方法
C. 获取方法的参数