Java Spring AOP 面向切面编程 简单总结

约定编程

  • 按照一定规则,将代码织入到约定的流程中。

Aop的本质是约定

  • 横切关注点:影响应用多处的功能(安全、事务、日志)
  • 横切关注点被模块化为特殊的类,这些类称为切面

切面作用:

  • 将多个类的通用行为封装成可重用的模块

当调用 proxy 的getProxyBean (测试代码)方法时, 其执行流程如下 

  • ( l )先执行拦截器的 before 方法。
  • (2)useAround 返回 true,则执行 around ,而本身方法 
  • ( 3 )无论怎样, 执行 after 方法。
  • (4)发生异常, 执行afterThrowing 方法, 否则执行 afterReturning 方法。

代理:

  • 增强或者控制对目标对象访问 

Proxy 的newProxyInstance

  • 类加载器:
  • 接口,
  • 逻辑实现。 

invocationHandler ,定义 invoke 方法,实现代理对象的逻辑的

AOP(@AspectJ 方式)

aop的作用或实质:

  • 约定编程:将代码织入约定的流程。

aop的实现:@Transactional注解

  • 实现了数据库资源的打开和关闭、 事务的回漆和提交

AOP 术语和流程

  • 基于方法,只能使用在方法上
  • 连接点: 被拦截的对象(点), Spring是方法。(如方法前后或异常)
  • 切点(切入点):一个或一组连接点,定义条件匹配连接点。(通知执行的位置。)
  • 通知: 特定的连接点执行的动作。(定义了何时使用)。
  • 目标(目标对象):被通知的对象,真正的业务逻辑
  • 织入 :切面应用到目标对象创建代理对象的过程
  • 织入 实现:通过动态代理生成代理对象,将切点定义匹配的连接点拦截,代码织入约定流程的过程。
  • 织入 可以在编译时,加载时,运行时完成。 spring是运行
  • 切面(aspect):通知和切入点的结合
  • 引入: 向现有类中添加方法或属性
  • 代理(proxy):通知目标对象后创建的对象

AOP 开发详解

  • 实现目标对象方法。
  • @Aspect 注解定义切面
  • @Before注解定义通知
  • @Pointcut注解定义切点,描述哪些类的哪些方法需要启用 AOP 编程
  • 切点标注在方法 ,在后面的通知注解中 就可以使用方法名称来定义

 Spring Boot 的配置启动文件

  • 指定扫描包:@SpringBootApplication(scanBasePackages = { ” com.springboot.chapter4 . aspect" }) 
  • 定义切面  @Bean(name=” myAspect” ) 

正则式定义什么时候启用 AOP

execution(* com.springboot.chapter4  aspect.service . 工mpl.UserServiceimpl . printUser ( . ) ) 

  •  • execution :执行时候,拦截正则匹配的方法:
  • * :任意返回类型
  •  com.springboot.chapter4.aspect.seice.impl. UserServicelmpl :指定对象的全限定名称
  •  printUser :指定方法
  •  (.):任意参数。。

  AspectJ 的指示器

  • @args()     限制参数(包含子类)  ,接受注解类
  • @target()  限制目标对象类型(包含子类) ,接受注解类
  • @within()  限定指定类型  ,,接受注解类
  • args()      限制参数(包含子类)
  • target()  限制目标对象类型(包含子类)
  • within()  限定指定类型 
  • @annotation()  限定注解

通知:

  • @Before,前置通知  :连接点前执行,。
  • @After  后置通知:连接点后执行,不管是否正常执行
  • @AfterReturning 正常返回通知 :连接点正常执行后执行,
  • @AfterThrowing 异常返回通知 :连接点抛出异常后执行。
  • @Around 环绕通知 :取代原有方法,提供回调原有方法能力(一般实现包裹被通知的方法,调用前后执行自定义的行为)

ProceedingJoinPoint

  • Around提供 ProceedingJoinPoint 参数,ProceedingJoinPoint 有 proceed回调原有方法

引入:引入类的属性或方法(作用:引入类增强服务)

  • 实现引入类方法(或其他包)
  • @DeclareParents 注解定义引入,
  • value:增强功能的目标对象。 (目标)
  • •defaultlmpl: 引入增强功能的类,

 通知获取参数

  • 使用args来绑定目标方法的参数
  • 非环绕通知使用 JoinPoint类型的参数获取参数
  • 环绕通知使用 ProceedingJoinPoint 类型获取参数
  • getArgs 获取信息

织入:切面应用到目标对象创建代理对象的过程

代理:

  • 使用 AOP 的类拥有接口时, 它会以 JDK 动态代理运行,否则以 CGLIB 运行。 

多个切面:

  • 配置启动文件定义多个@bean
  • 实现Ordered 接口定义切面顺序,实现getOrder 方法。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值