您当前的位置: 首页 >  面试

java持续实践

暂无认证

  • 2浏览

    0关注

    746博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

面试必问之: Aop详解

java持续实践 发布时间:2021-06-03 10:14:44 ,浏览量:2

https://www.cnblogs.com/joy99/p/10941543.html

文章目录
      • 以事务举例aop
      • Aop : 面向切面编程
      • SpringAop的动态代理
      • AOP 领域中的特性术语
      • 注解声明的5种通知类型
      • 通过注解声明切点表达式

以事务举例aop

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.
AOP 领域中的特性术语
  • 通知(Advice): AOP 框架中的增强处理。通知描述了切面何时执行以及如何执行增强处理。
  • 连接点(join point): 连接点表示应用执行过程中能够插入切面的一个点,这个点可以是方法的调用、异常的抛出。在 Spring AOP 中,连接点总是方法的调用。
  • 切点(PointCut): 可以插入增强处理的连接点。
  • 切面(Aspect): 切面是通知和切点的结合。
  • 引入(Introduction):引入允许我们向现有的类添加新的方法或者属性。
  • 织入(Weaving): 将增强处理添加到目标对象中,并创建一个被增强的对象,这个过程就是织入。

execution指示器是我们在编写切点定义时最主要使用的指示器,在此基础上,我们使用其他指示器来限制所匹配的切点,声明了切点. 如果要限定包, 可以用within , 如果要限定 bean, 可以用bean

注解声明的5种通知类型

前置通知, 后置通知 , 返回通知, 异常通知, 环绕通知. 在这里插入图片描述

通过注解声明切点表达式

不用切点表达式的时候 , 写法如下, 如果有多个通知, 要写多个切点 在这里插入图片描述 可以使用@Pointcut 注解来定义切点, 其他地方引用切点即可. 在这里插入图片描述

关注
打赏
1658054974
查看更多评论
立即登录/注册

微信扫码登录

0.0429s