前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >A-O-P 一篇概览

A-O-P 一篇概览

作者头像
WindWant
修改2023-05-18 09:47:46
修改2023-05-18 09:47:46
23500
代码可运行
举报
文章被收录于专栏:后端码事后端码事
运行总次数:0
代码可运行

一、什么是AOP?

AOP 即 Aspect-oriented Programming,Aspect 切面,什么是切面,就是一条大路上的收费站,检查站,首先它是一个统一的功能单元,或是收费、或是检查,其次它可以决定对谁收费,对谁收多少费,对谁检查。与之相对的是 OOP 即 Object-oriented Programming,Object 对象,对象就是大路上的一辆辆汽车,每辆汽车都有一套完成的功能系统,有发动机、车架、车轮、方向盘等,每辆车又各自不同,或是小轿、或是SUV、又或是货车等等,AOP 是对 OOP 的补充,是程序结构涉及的一种方式。

二、核心概念

  • Aspect:模块化的关注点(切面),例如事务。通常以 @Aspect 注解类形式应用。一个小容器。 package com.xyz; import org.aspectj.lang.annotation.Aspect; @Aspect public class NotVeryUsefulAspect { }
  • Join point::程序执行过程中的一个点,例如一个方法,或者一个异常处理。Spring AOP 中,通常代表一个方法的执行。在何处执行。 @Before("execution(* com.xyz.dao.*.*(..))") public void doAccessCheck(JoinPoint jp) { // ... } 可以通过 JointPoint 获取执行点的一系列数据:
    • getArgs():方法参数。
    • getThis():返回代理对象。
    • getTarget():返回被代理的对象。
    • getSignature():方法描述。
  • Advice:在 joint point 处需要执行的操作。包括 "around"、"before" 及 "after" 等。advice 通常会被模块化为拦截器,多个 advices 以拦截器链的形式作用于 joint point。执行什么。 @After("execution(* com.xyz.dao.*.*(..))") public void doAccessCheck() { // ... } 关于 advice 顺序: spring aop 中定义顺序:@Around、@Before、@After、@AfterReturning、@AfterThrowing 应用 AspectJ 则遵从 @After 作为最终执行顺序,于 @AfterReturning、@AfterThrowing 之后执行。 同一个 joint point 处的同类 advice 以 @Order 执行执行顺序。
  • Pointcut:用以匹配 joint point 的断言,可以称之为代表一系列 joint point。结合 Advice 使用。匹配何处执行语义。 @Pointcut("execution(public * *(..))") public void publicMethod() {} Pointcut 使得 advice 可以作用于目标对象,同时又独立于对象,是实现面向切面的关键概念。
  • Target object:advices 执行的目标对象。代理对象。
  • AOP proxy:代理,用以实现切面合约。JDK动态代理或者CGLIB 代理。
  • Weaving:织入,将切面和其它应用对象链接在一起来创建执行对象。组装。

三、能力和目标

Spring AOP 目前只支持方法级别的 joint point(spring bean 中的方法),如果需要其它粒度,如属性字段,可以使用 AspectJ。

Spring AOP 没有实现完整的 AOP 功能,它的出现旨在整合 AOP 功能和 Spring IoC 容器,用以解决企业实际应用中常见的问题。

Spring AOP 和 AspectJ 并非竞争关系,它们各自都是非常成熟的框架,适用于不同的目的。Spring 可以在基于 Spring 框架的应用架构中无缝整合 Spring AOP、IoC 及 AspectJ,以完整地使用 AOP 功能。

四、代理

Spring AOP 是基于代理的,默认使用 JDK 动态代理,用以实现接口代理。

非接口代理需要使用 CGLIB。 

五、AspectJ

1、AnnotationAwareAspectJAutoProxyCreator

ApplicationContext:入口。

AspectJAutoProxyBeanDefinitionParser:AspectJ 解析器,自动发现注册 AspectJ 风格的切面。

AnnotationAwareAspectJAutoProxyCreator 会根据定义的切点来自动代理相匹配的 bean。AnnotationAwareAspectJAutoProxyCreator 的层次结构如下:

AnnotationAwareAspectJAutoProxyCreator 实现了 BeanPostProcessor 接口,会在对应 Bean 实例化后应用此 BeanPostProcessor。

AnnotationAwareAspectJAutoProxyCreator 用于处理所有 AspectJ 声明的切面。

2、AspectJProxyFactory

基于 AspectJ 的代理工厂。可以用于编程方式创建包含切面的对象代理。

代码语言:javascript
代码运行次数:0
运行
复制
//创建代理工厂
AspectJProxyFactory factory = new AspectJProxyFactory(targetObject);

// 添加 AspectJ aspect,可以多次添加,可以使 class 或者 instance。
factory.addAspect(SecurityManager.class); //.addAspect(usageTracker);

// 获取对象代理
MyInterfaceType proxy = factory.getProxy();

六、附加订阅

后端码事
后端码事
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-04-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、什么是AOP?
  • 二、核心概念
  • 三、能力和目标
  • 四、代理
  • 五、AspectJ
    • 1、AnnotationAwareAspectJAutoProxyCreator
    • 2、AspectJProxyFactory
  • 六、附加订阅
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档