事务管理
正常情况:
异常情况
事务管理
默认情况下:@Transactional只有出现运行时异常才能正常回滚事务
一般加在Service层上,而且方法中有多次数据库的增删改时加上此注释
@Transactional (rollbackFor = Exception.class) 出现所有异常都会回滚
propagation属性不添加时,默认为REQUIRED
事务同时只能存在一个,外层方法已经标记为一个事务,内部的方法,如果不进行特别的说明就会默认为同一个事务
这样内部的方法是一个独立的事务,即便外层的事务失败,内部的方法也会成功,就可以达到无论解散部门失败还是成功,都会记录日志的效果
AOP
用一句话总结AOP:将与核心业务无关的代码独立的抽取出来,形成一个独立的组件,然后以横向交叉的方式应用到业务流程当中的过程被称为AOP。
面向特定的方法编程,可以在不改动原始方法的基础上,针对于原始的方法进行编程,这个编程可以是原功能的增强,也可以是原始功能的改变,
面向切面编程仅仅是一种编程思想
动态代理技术是面向切面编程这种思想最主流的实现方式
SpringAOP的底层就是动态代理技术
@Aspect指定这个类不是普通的类,是一个AOP类
@Around指定把这个AOP方法加在 哪个包下的哪些方法 上
AOP应用场景:
这里object result = joinPoint.proceed () ;必须要有返回值,不然原始方法运行完,拿不到返回值
这里@Around("execution(* com.itheima.service.impl.*.*(..)))"")
第一个 * 表示任意类型的返回值
第二个和第三个 * 表示任意类名、任意方法名
最后的 .. 表示任意的形参
重复形参过多,可以在类中提前定义好切入点表达式
包名.类名不建议省略
* 任意单个字符 或者 通配包名类名方法名的一部分
.. 任意多个字符 或者 任意层级的包 或者任意任意、任意 个数的参数
注意:形参如果不采用通配符的话,要使用全类名
如何同时匹配两个完全不相关的切入点:使用 || 连接
通过自定义注释,然后匹配有特定注解的方法
1.自定义一个注释
2.在特定方法上加上这个自定义注释
3.将切入点设置为 自定义注释
对于除了@Around以外的其它四种通知
要记录返回值和执行时长,所以要用@Around注释
由于增删改没有命名规律,所以用@Log自定义注释,再用@annotation引入切入点的方式比较简单
注意:也是难点