Aspect Oriented Programming

===

动态代理

实现方式

jdk动态代理:使用jdk中的Proxy,InvocationHandler创建代理对象

​ jdk动态代理要求目标必须实现接口

cglib动态代理:第三方工具库,创建代理对象,原理是继承。通过继承目标类,创建子类。子类就是代理对象,要求目标类和方法不能是final

动态代理的作用

  1. 在目标类源代码不变的条件下增加功能
  2. 减少代码冗余
  3. 使开发人员专注于业务逻辑
  4. 解耦合,让业务功能和非业务功能分离

AOP(Aspect Oriented Programming)

面向切面编程,基于动态代理,可以使用jdk,cglib两种代理方式。

AOP就是动态代理的规范化,将动态代理的实现步骤和方法都定义好,让开发人员

用统一的方式使用动态代理

  • Aspect:切面,指给目标类额外增加的功能

    切面的特点:一般都是非业务方法,常见为日志,事务,统计,参数检查,权限验证等

  • Orient:面向

  • Programming:编程

  1. 需要在分析项目功能时找出切面(独立于业务的增强方法)
  2. 合理的安排切面执行时间(目标方法前or后)
  3. 合理的安排切面执行的位置,在哪个类,哪个方法添加增强功能

一些术语

  1. Joinpoint:连接点,连接业务和增强方法的位置
  2. Pointcut:切入点,指多个连接点集合
  3. 目标对象:欲增强方法的类
  4. Advice:通知,表示切面功能的执行时间

一个切面有三个关键要素

  1. what:切面的功能代码,要干什么
  2. where:切面执行位置,用pointcut表示
  3. when:切面执行时间,用Advice表示

AOP的实现

aop是一个规范,是动态代理的规范和标准

实现框架:

  1. spring:spring在内部实现了aop规范,能做aop工作

    spring主要在事务处理使用aop。

    但由于其实现较笨重,在项目开发中很少使用spring的aop

  2. aspectJ:一个开源的专门做aop的框架,spring框架中集成了aspectj框架,可直接通过spring使用aspectj的功能

    实现方式:

    • xml配置文件:配置全局事务
    • 注解实现是更常用的方法,aspectj有5个注解。

学习aspectj框架的使用

切面的执行时间,这个执行时间在规范中叫做Advice(通知,也有人称为增强),在aspectj框架中使用注解表示执行时间点:(xml标签也可以)

  • @Before
  • @AfterReturning
  • @Around
  • @AfterThrowing
  • @After

aop实现步骤

image-20210314172339857

具体代码见:

github.com/AndyLeezCode/Learn_Spring/tree/master/ch05-aop-leading

github.com/AndyLeezCode/Learn_Spring/tree/master/ch06-aop-aspectj

小结

8DAE2181483EE3CEC7D7A64B68086440

4816E6F7DB1E5FAE44C403D887DF8F18

原文地址:https://www.cnblogs.com/potofsalt/p/14533460.html