https://www.cnblogs.com/joy99/p/10941543.html
- 以事务举例aop
- Aop : 面向切面编程
- SpringAop的动态代理
- AOP 领域中的特性术语
- 注解声明的5种通知类型
- 通过注解声明切点表达式
aop的举例: 事务. 数据库都会提供一个事务机制,如果开启一个事务, 在这个事务里执行多条增删改查的sql语句, 在这个过程中, 如果任何一个sql执行失败了, 都会导致这个事务的回滚, 把其他的sql的数据都恢复回去. 在一个事务里面的所有sql , 要么一起成功 , 要么一起失败, 事务成功可能保证我们的数据一致性.
手动加事务的操作: 开启事务, 回滚事务, 提交事务.
切面的定义, 可以指定类, 或者包等的定义. 在这些类的所有方法中, 去运行的时候, 开启事务, 所有方法运行完毕之后,如果抛出异常, 就回滚事务, 如果没有异常就提交事务.
面向切面编程, 根据定义好的规则 , 去织入代码. 动态代理 .
代理类, 去开启事务, 执行业务, 是否抛出异常, 去提交还是回滚事务. 在Controller中, 注入的Service类, 也是代理类,
很多类,都要去加, 事务, 事务代码是重复的, 对符合某种规则的类, 切面去对符合规则的类, 去织入 增强的代码,
动态代理: 和目标类实现一样的接口, 把代理类的对象, 注入到类似Controller代码中.
Aop : 面向切面编程使用aop的原因: 某些地方有重复的代码, 比如记录日志, 比如Spring的事务就是开启事务, 执行业务, 提交或回滚事务. 开启事务, 提交或回滚事务就是重复的代码, 可以把这些代码进行抽取, 当需要修改的时候, 只需要修改抽取的代码, 不用处处修改.
SpringAop的动态代理在运行阶段动态生成代理对象, jdk动态代理 或 CGlib动态代理 .
在项目启动的时候有一个参数: @EnableAspectJAutoProxy(ProxyTargetClass = false)
- ProxyTargetClass : 默认是false, 在false的时候,如果实现了接口, 用jdk代理, 如果没有实现接口, 用cglib动态代理.
- ProxyTargetClass 如果是true , 无论是否实现接口, 都会使用cglib.
- 通知(Advice): AOP 框架中的增强处理。通知描述了切面何时执行以及如何执行增强处理。
- 连接点(join point): 连接点表示应用执行过程中能够插入切面的一个点,这个点可以是方法的调用、异常的抛出。在 Spring AOP 中,连接点总是方法的调用。
- 切点(PointCut): 可以插入增强处理的连接点。
- 切面(Aspect): 切面是通知和切点的结合。
- 引入(Introduction):引入允许我们向现有的类添加新的方法或者属性。
- 织入(Weaving): 将增强处理添加到目标对象中,并创建一个被增强的对象,这个过程就是织入。
execution指示器是我们在编写切点定义时最主要使用的指示器,在此基础上,我们使用其他指示器来限制所匹配的切点,声明了切点. 如果要限定包, 可以用within , 如果要限定 bean, 可以用bean
前置通知, 后置通知 , 返回通知, 异常通知, 环绕通知.
不用切点表达式的时候 , 写法如下, 如果有多个通知, 要写多个切点 可以使用
@Pointcut
注解来定义切点, 其他地方引用切点即可.