A-O-P 一篇概览

一、什么是AOP?

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

二、核心概念

Aspect:模块化的关注点(切面),例如事务。通常以 @Aspect 注解类形式应用。一个小容器

package com.xyz;import org.aspectj.lang.annotation.Aspect;@Aspectpublic 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。

五、AspectJ1、AnnotationAwareAspectJAutoProxyCreator

ApplicationContext:入口。

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

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

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

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

2、AspectJProxyFactory

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

//创建代理工厂AspectJProxyFactory factory = new AspectJProxyFactory(targetObject);// 添加 AspectJ aspect,可以多次添加,可以使 class 或者 instance。factory.addAspect(SecurityManager.class); //.addAspect(usageTracker);// 获取对象代理MyInterfaceType proxy = factory.getProxy();

标签:

最近更新

A-O-P 一篇概览
2023-04-27 14:30:46
横店东磁:合理利用自身光伏渠道助推家储产品发展
2023-04-27 14:05:25
辽宁全面振兴 盘锦走在前列 | 辽宁首批!盘锦大米、盘锦河蟹上榜!|环球看热讯
2023-04-27 13:11:10
世界今日报丨菲菱科思4月27日盘中跌幅达5%
2023-04-27 12:56:51
农技专家到田间 服务群众暖心田_天天最资讯
2023-04-27 12:20:35
观焦点:上海金融监管局局长:探索开展金融数据安全有序跨境流动试点,支持临港新片区国际数据港建设
2023-04-27 11:49:51
免费体检进工地 为一线职工筑起健康"防护墙"
2023-04-27 11:16:47
中国忠旺浮沉录-报道
2023-04-27 10:56:01
广东潮州:首次买一手住房 可提取公积金支付首付款
2023-04-27 10:41:37
全球信息:五华区:杜绝“躺平”激励干部担当作为
2023-04-27 10:17:59
港交所2023年首季收入及其他收益同比上升19%_微速讯
2023-04-27 09:44:19
天天新资讯:中证500ETF博时:融资净买入25.14万元,融资余额136.28万元(04-26)
2023-04-27 08:58:20
俄罗斯乌克兰关系很差吗 俄罗斯乌克兰关系
2023-04-27 08:25:23
天天短讯!屯留农商行召开“首季开门红”总结表彰暨“强根”冲刺工作推进会
2023-04-27 07:25:30
婚姻的感悟句子(婚姻的感悟)
2023-04-27 06:33:31
世界今热点:注意!格尔软件将于5月17日召开股东大会
2023-04-27 05:27:25
下载网卡驱动程序_网卡驱动程序不正常怎么解决|每日快看
2023-04-27 04:07:32
快讯2023-04-27 00:10:37 世界百事通
2023-04-27 01:09:26
速递!日照楼市动态每日速报:4月26日销售动态
2023-04-26 22:54:24
热门看点:汉朝官职与现代对比_汉朝官职
2023-04-26 22:06:45
“精质的新亿”保亿置业品牌战略暨重庆六盘发布
2023-04-26 21:11:16
关于法西斯战争的资料
2023-04-26 20:58:26
蓝思科技走出亏损迷雾 世界即时
2023-04-26 19:52:47
黄金“时刻”来临:全球央行狂购黄金 或成年内最佳避险投资?
2023-04-26 19:14:51
深证成指和创业者指止跌 专家乐观看待后市
2023-04-26 18:45:31
全球快看:谁是中药一哥?云南白药营收是片仔癀四倍,但市值差了600亿
2023-04-26 18:11:11
湖北两机场客运航线上新!
2023-04-26 17:41:55
【天天新要闻】关岭开展医保基金监管集中宣传月活动
2023-04-26 17:33:20
峰米激光电视C3预热:10.7亿色、AIPQ+FAV智能画质引擎-环球观点
2023-04-26 16:46:19
《蜘蛛侠:纵横宇宙》确认引进!今年暑期上映-世界焦点
2023-04-26 16:41:46