发布时间:2025-12-10 23:19:17 浏览次数:2
spring 两大特性IOC(bean交给容器管理), AOP(面向切面编程,是一种编程思想)
AOP (Aspect Orient Programming),直译过来就是 面向切面编程。AOP 是一种编程思想,是面向对象编程(OOP)的一种补充。面向对象编程将程序抽象成各个层次的对象,而面向切面编程是将程序抽象成各个切面。
1,静态代理
根据需要,为每个类实现代理,不够灵活,
2,动态代理, 使用JDK实现
//ClassLoader被代理类类加载器//interfaces被代理类接口集合//InvocationHandler接口的实现类,主要是重写invoke方法Proxy.newProxyInstance(ClassLoaderloader,Class<?>[]interfaces,InvocationHandlerh)
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, 表锁
publicclassLogTest{@Transactionalpublicvoidbuy(){sub();add();log();saveLog();}@Transactional(propagation=Propagation.REQUIRES_NEW)publicvoidlog(){//父方法没有事物,当前方法开启一个新事物//父方法开启事物,将父方法事物挂起,这里新开一个事物,执行完再执行父事物System.out.println("不管父方法是否扣款,都会记录日志到数据库");}@Transactional(propagation=Propagation.REQUIRED)publicvoidsub(){//如果父方法buy也开启了事物,则加入父事物System.out.println("扣款方法");}@Transactional(propagation=Propagation.REQUIRED)publicvoidadd(){//如果父方法buy也开启了事物,则加入父事物System.out.println("存款方法");}@Transactional(propagation=Propagation.SUPPORTS)publicvoidsaveLog(){//saveLog方法不单独开启事物,如果有父事物就加入会一起回滚System.out.println("只是记录日志");}}到此,关于“Spring AOP的原理和使用方法”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注本站网站,小编会继续努力为大家带来更多实用的文章!