这篇文章主要介绍“Spring AOP的原理和使用方法”,在日常操作中,相信很多人在Spring AOP的原理和使用方法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Spring AOP的原理和使用方法”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!
spring 两大特性IOC(bean交给容器管理), AOP(面向切面编程,是一种编程思想)
AOP (Aspect Orient Programming),直译过来就是 面向切面编程。AOP 是一种编程思想,是面向对象编程(OOP)的一种补充。面向对象编程将程序抽象成各个层次的对象,而面向切面编程是将程序抽象成各个切面。
1,静态代理
根据需要,为每个类实现代理,不够灵活,
2,动态代理, 使用JDK实现
// ClassLoader 被代理类类加载器 // interfaces 被代理类接口集合 // InvocationHandler 接口的实现类, 主要是重写invoke 方法 Proxy.newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)
spring 默认使用的方式,比较灵活,在内存中生成了一个和代理类相同接口的类,所以实例化后,只能用接口接受,
缺点: 类必须实现了接口,代理类用接口接受,
3,动态代理,CGLIN实现,底层是字节码
使用方式和JDK 一样
不同点: 对于没有接口的类,也可以代理,底层是用字节码实现
Before:方法执行前执行
After:方法返回后或异常后执行 ,先于AfterThrowing, AfterReturning 执行
AfterThrowing: 方法异常后执行
AfterReturning 方法返回后执行
Around: 环绕方法
* com.study.common..*.*(..) 第一个* 表示范围,返回类型(可省略), 类路径,一个点表示当前路径,两个点表示子及 子孙包,* 表示包含任意路径, 最后一个* 匹配所有方法,(..) 方法的参数, .. 表示任意参数
使用@Aspect 标注的类,是切面,
@Pointcut 是切点,后面接切点表达式
execution:用于匹配连接点的执行方法,
within 只能到类,
args:限制切入点到参数,
this,target: 都只能切到类或者接口。对于切入的类,如果实现了接口, this前后环绕不生效,target 没有影响
annotation: 根据注解切入
多个表达式,可以用&& ,||
原子性(Atomicity),强调的是一整件事的完整性, 这件事的过程必须全部完成(买东西,付款,发货,收货)
一致性(Consistency),强调一种状态变为另一种状态,并且全部完成(取钱后 -> 银行,个人钱的总数较之前不变)
隔离性(Isolation),当前事物不受别的事物影响
持久性(Durability),已提交的事物,永久生效
脏读:一个事物,读取了另一个事物未提交的数据
不可重复读(行级锁):一个事物读取另一个事物修改的数据
幻读(表级锁):一个事物读取另一个事物inset,delete 数据
读未提交(READ_UNCOMMITTED),读已提交(READ_COMMITTED),可重复读(REPEATABLE_READ),串行化:(SERIALIZABLE)
mysql 默认可重复读,行锁
oracle 默认serializable, 表锁
public class LogTest{ @Transactional public void buy() { sub(); add(); log(); saveLog(); } @Transactional(propagation = Propagation.REQUIRES_NEW) public void log() { // 父方法没有事物,当前方法开启一个新事物 // 父方法开启事物,将父方法事物挂起,这里新开一个事物,执行完再执行父事物 System.out.println("不管父方法是否扣款,都会记录日志到数据库"); } @Transactional(propagation = Propagation.REQUIRED) public void sub() { // 如果父方法buy 也开启了事物, 则加入父事物 System.out.println("扣款方法"); } @Transactional(propagation = Propagation.REQUIRED) public void add() { // 如果父方法buy 也开启了事物, 则加入父事物 System.out.println("存款方法"); } @Transactional(propagation = Propagation.SUPPORTS) public void saveLog() { // saveLog方法不单独开启事物,如果有父事物就加入会一起回滚 System.out.println("只是记录日志"); } }
到此,关于“Spring AOP的原理和使用方法”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注亿速云网站,小编会继续努力为大家带来更多实用的文章!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。