spring的AOP(切面编程)
需求:接口 (1000个方法 想要修改在其中的某一个方法)
代理(jdk动态代理 cglib代理)
jdk动态代理(只能修改接口中的方法)
cglib代理 (只能修改类中的方法)
1、jdk的动态代理
接口
实现类
代理类
测试
2、cglib代理
类
代理类
测试
3、AOP专业名词解释
JoinPoint(连接点) 在需要修改的类中,将要修改的方法
PointCut(切入点) 在需要修改的类中,已经修改过的方法
Advice(通知) 在原有的功能上新添加的功能
aspect(增强) 在原有的功能上新添加的功能
Target(目标对象) 被代理的对象
weaving(织入) 增强代码的过程
4、用springAop的方式对指定的方法进行增强
a、导入jar包
b、写一个类
目标类
通知类
package com.ujiuye.aop;
import org.aspectj.lang.ProceedingJoinPoint;
public class MyAdvice {
/**
* 在对方法进行增强的时候,有几种方式可以进行增强
* 前置通知(在原来的代码之前新增功能)
* 后置通知(在原来的代码之后新增功能)
* 环绕通知(在原来的代码的前后都新增功能)
* 异常通知(在原来的代码出现异常的时候,才能添加新的功能)
*/
// 前置通知
void before(){
System.out.println("前置通知");
}
//后置通知
void after(){
System.out.println("后置通知");
}
// 环绕通知
Object huanrao(ProceedingJoinPoint pjp) throws Throwable {
System.out.println("环绕的头");
Object proceed = pjp.proceed();
System.out.println("环绕的结束");
return proceed;
}
// 异常通知
void excep(){
System.out.println("异常通知");
}
}
c、写配置文件
切入点表达式的规范:
execution();
修饰符 可以省略不写
方法的返回值 不能省略但是可以用表示
目标类所在的包 不能省略,但是可以用 …
目标类的名称 不能省略但是可以用*
方法名 不能省略但是可以用*
方法的参数 用…带表示
根据这个规范我们可以这样写切入点表达式
* *..*.*.*(..) 这样看着很帅但是不可取
正规的方式
* com.ujiuye.service.impl.*.save(..);
d、测试
5、spirngAOP的注解开发
用注解开发和xml配置文件的方式有两个不同点,其它代码都一样
A、在配置文件中
B、在通知中
6、spring事务开发
事务:
原子性 一致性 隔离性 持久性
事务的传播:
REQUIRED(如果有事务就加入事务,如果没有就创建)
事务的隔离:
读取没有提交的数据(脏读,不可以重复读)
读取已经提交的数据(幻读,重复读)
可重复读
串行化
需求:A给B转账 A有1000 B 有1000
如果:A 给B转账,在转账的过程中出现问题,会导致B没有收到钱,但是A的钱也没了?
解决方案:在转账的过程中加入事务,如果出现异常会回滚
A、用配置文件的方式使用事务
配文件的有关事务的配置
业务逻辑层代码
B、用注解的方式开发事务(推荐使用)
配置文件
业务逻辑层代码