Spring面向切面编程 AOP

267 阅读2分钟

什么是AOP

  • Aspect Oriented Program ⾯向切⾯编程

在不改变原有逻辑上增加额外的功能,⽐如解决系统层⾯的问题,或者增加新的功能

例如,在一个地方买商品,买的核心业务逻辑,需要做权限校验(是否是用户,是否登录),我们一般是在拦截器去做,拦截器也是AOP思想的体现,所以就可以在下单之前做一个权限控制而不是在service层去做。

  • 场景

    • 权限控制
    • 缓存
    • 日志处理
    • 事务控制
  • AOP思想把功能分两个部分,分离系统中的各种关注点

  • 核⼼关注点

    • 业务的主要功能
      • 例如下单
  • 横切关注点

    • ⾮核⼼、额外增加的功能
      • 例如下单前的权限校验、日志等
  • 好处

    • 减少代码侵入,解耦
    • 可以统⼀处理横切逻辑
    • ⽅便添加和删除横切逻辑

AOP面向切面编程的核心概念

  • 横切、通知、连接点、切⼊点、切⾯

  • 横切关注点

对哪些⽅法进⾏拦截,拦截后怎么处理,这些就叫横切关注点,比如 权限认证、⽇志、事物

  • 通知 Advice

在特定的切⼊点上执⾏的增强处理,有5种通知。⽐如你需要记录⽇志,控制事务 ,提前编写好通⽤的模块,需要的地⽅直接调⽤

  • 连接点 JointPoint

要⽤通知的地⽅,业务流程在运⾏过程中需要插⼊切⾯的具体位置,⼀般是⽅法的调⽤前后,全部⽅法都可以是连接点,只是概念,没啥特殊

  • 切⼊点 Pointcut

不能全部⽅法都是连接点,通过特定的规则来筛选连接点,就是Pointcut,选中那⼏个你想要的⽅法。在程序中主要体现为书写切⼊点表达式(通过通配、正则表达式)过滤出特定的⼀组JointPoint连接点。过滤出相应的 Advice 将要发⽣的joinpoint地⽅

  • 切⾯ Aspect

通常是⼀个类,⾥⾯定义 切⼊点+通知,定义在什么地⽅、什么时间点、做什么事情,通知advice指明了时间和做的事情(前置、后置等),切⼊点pointcut指定在什么地⽅⼲这个事情,web接⼝设计中,web层->⽹关层->服务层->数据层,每⼀层之间也是⼀个切⾯,对象和对象,⽅法和⽅法之间都是⼀个切⾯

  • ⽬标 target

⽬标类,真正的业务逻辑,可以在⽬标类不知情的条件下,增加新的功能到⽬标类的链路上

  • 织⼊ Weaving

把切⾯(某个类)应⽤到⽬标函数的过程称为织⼊

  • AOP代理

AOP框架创建的对象,代理就是⽬标对象的加强,Spring中的AOP代理可以是JDK动态代理,也可以是CGLIB代理