SpringAOP的原理和使用方法

这篇文章主要介绍“Spring AOP的原理和使用方法”,在日常操作中,相信很多人在Spring AOP的原理和使用方法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Spring AOP的原理和使用方法”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

创新互联,是成都地区的互联网解决方案提供商,用心服务为企业提供网站建设、成都app软件开发公司小程序开发、系统专业公司和微信代运营服务。经过数十余年的沉淀与积累,沉淀的是技术和服务,让客户少走弯路,踏实做事,诚实做人,用情服务,致力做一个负责任、受尊敬的企业。对客户负责,就是对自己负责,对企业负责。

spring 两大特性IOC(bean交给容器管理), AOP(面向切面编程,是一种编程思想)

1. 什么是aop

AOP (Aspect Orient Programming),直译过来就是 面向切面编程。AOP 是一种编程思想,是面向对象编程(OOP)的一种补充。面向对象编程将程序抽象成各个层次的对象,而面向切面编程是将程序抽象成各个切面。

Spring AOP的原理和使用方法

2 aop 实现方式

1,静态代理

根据需要,为每个类实现代理,不够灵活,

2,动态代理, 使用JDK实现

// ClassLoader 被代理类类加载器
// interfaces  被代理类接口集合
// InvocationHandler 接口的实现类, 主要是重写invoke 方法
Proxy.newProxyInstance(ClassLoader loader, Class[] interfaces, InvocationHandler h)

spring 默认使用的方式,比较灵活,在内存中生成了一个和代理类相同接口的类,所以实例化后,只能用接口接受,

缺点: 类必须实现了接口,代理类用接口接受,

3,动态代理,CGLIN实现,底层是字节码

使用方式和JDK 一样

不同点: 对于没有接口的类,也可以代理,底层是用字节码实现

3. aop 通知方式

Before:方法执行前执行 

After:方法返回后或异常后执行 ,先于AfterThrowing, AfterReturning 执行

AfterThrowing: 方法异常后执行

AfterReturning 方法返回后执行

Around: 环绕方法

4, 切点表达式

* com.study.common..*.*(..)  第一个* 表示范围,返回类型(可省略), 类路径,一个点表示当前路径,两个点表示子及 子孙包,* 表示包含任意路径, 最后一个* 匹配所有方法,(..) 方法的参数, ..  表示任意参数

使用@Aspect 标注的类,是切面,

@Pointcut 是切点,后面接切点表达式

execution:用于匹配连接点的执行方法,

within 只能到类,

args:限制切入点到参数,

this,target: 都只能切到类或者接口。对于切入的类,如果实现了接口, this前后环绕不生效,target 没有影响

annotation: 根据注解切入

多个表达式,可以用&& ,|| 

5,事物

5.1 事物:四大特性(ACID),

原子性(Atomicity),强调的是一整件事的完整性, 这件事的过程必须全部完成(买东西,付款,发货,收货)

一致性(Consistency),强调一种状态变为另一种状态,并且全部完成(取钱后 -> 银行,个人钱的总数较之前不变)

隔离性(Isolation),当前事物不受别的事物影响

持久性(Durability),已提交的事物,永久生效

5.2 隔离级别  Isolation

脏读:一个事物,读取了另一个事物未提交的数据

不可重复读(行级锁):一个事物读取另一个事物修改的数据

幻读(表级锁):一个事物读取另一个事物inset,delete 数据

Spring AOP的原理和使用方法

读未提交(READ_UNCOMMITTED),读已提交(READ_COMMITTED),可重复读(REPEATABLE_READ),串行化:(SERIALIZABLE)

MySQL 默认可重复读,行锁

oracle 默认serializable, 表锁

5.3 传播行为

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的原理和使用方法”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注创新互联网站,小编会继续努力为大家带来更多实用的文章!


分享文章:SpringAOP的原理和使用方法
标题URL:http://scyanting.com/article/pdedoc.html