SpringAOP联盟(1)—Advisor,Advice,Pointcut,Advised、ProxyConfig

SpringAop类比较错综复杂,但向上追述源头,那么可以理解为下图的关系。

关系图.png

源码介绍

案例:代理对象的生成过程

@Test
public void testProxyFactory() {
    Person person = new Person();
    //被建议的类,即面向目标类生成代理类
    ProxyFactory proxyFactory = new ProxyFactory(person);
    NameMatchMethodPointcut nameMatchMethodPointcut = new NameMatchMethodPointcut();
    nameMatchMethodPointcut.addMethodName("run1");
    //通知+切点=advisor
    DefaultPointcutAdvisor advisor = new DefaultPointcutAdvisor();
    advisor.setPointcut(nameMatchMethodPointcut);
    advisor.setAdvice(new MethodBeforeAdvice() {
        @Override
        public void before(Method method, Object[] args, Object target) throws Throwable {
            System.out.println("before Advice...");
        }
    });
    //advisor放入到adviced
    proxyFactory.addAdvisor(advisor);
    //最后经过代理生成代理对象
    Person proxy = (Person) proxyFactory.getProxy();
    proxy.run1();
}

SpringAOP概述

AOP面向切面编程,在程序中具有公共特性的某些类/某些方法进行拦截,在方法执行前/执行后等增加一些方法。

1. Pointcut切点

类名 作用
NameMatchMethodPointcut 通过方法名进行精确匹配的。
ControlFlowPointcut 根据在当前线程的堆栈信息中的方法名来决定是否切入某个方法(效率较低)
ComposablePointcut 组合模式的 Pointcut, 主要分成两种: 1.组合中所有都匹配算成功 2. 组合中都不匹配才算成功
JdkRegexpMethodPointcut 通过 正则表达式来匹配方法
AspectJExpressionPointcut 通过 AspectJ 包中的组件进行方法的匹配(切点表达式)
TransactionAttributeSourcePointcut 通过 TransactionAttributeSource 在 类的方法上提取事务注解的属性 @Transactional 来判断是否匹配, 提取到则说明匹配, 提取不到则说明匹配不成功
AnnotationJCacheOperationSource 支持JSR107的cache相关注解的支持
// 由 ClassFilter 与 MethodMatcher 组成的 pointcut
public interface Pointcut {
    // 类过滤器, 可以知道哪些类需要拦截
    ClassFilter getClassFilter();
    // 方法匹配器, 可以知道哪些方法需要拦截
    MethodMatcher getMethodMatcher();
    // 匹配所有对象的 Pointcut
    Pointcut TRUE = TruePointcut.INSTANCE;
}

2. Advice通知

Advice通知 作用
MethodBeforeAdvice 在目标方法执行之前执行。主要实现:AspectJMethodBeoreAdvice
AfterReturningAdvice 在目标方法执行后执行,主要实现类:AspectJAfterAdviceAspectJAfterReturningAdviceAspectJAfterThrowingAdvice
AspectJAroundAdvice 环绕通知

在Proxy中最终执行的其实就是MethodInterceptor。因为这些Advice最终都是交给AdvisorAdapteradvice适配为MethodInterceptor

MethodInterceptor 作用
CustomizableTraceInterceptor 对方法调用前后拦截一下
SimpleTraceInterceptor 正常效果同上,异常也是同样的输出,没CustomizableTraceInterceptor强大
DebugInterceptor SimpleTraceInterceptor的子类。有个计数器,记录被拦截的次数,且可以这样获取出来advice.getCount()
PerformanceMonitorInterceptor 记录每个方法运行的时长
AfterReturningAdviceInterceptor 这个类其实就是将 AfterReturningAdvice 包裹成 MethodInterceptor 的适配类, 而做对应适配工作的就是 AfterReturningAdviceAdapter
MethodBeforeAdviceInterceptor 这个类其实就是将 MethodBeforeAdvice 包裹成 MethodInterceptor 的适配类, 而做对应适配工作的就是 MethodBeforeAdviceAdapter
ThrowsAdviceInterceptor 这个类其实就是将 ThrowsAdvice 包裹成 MethodInterceptor 的适配类, 而做对应适配工作的就是 ThrowsAdviceAdapter
TransactionInterceptor 这个类就是大名鼎鼎的注解式事务的工具类, 这个类通过获取注解在方法上的 @Transactional 注解的信息来决定是否开启事务的 MethodInterceptor

3. Advisor

类名 作用
PointcutAdvisor Spring 中常用的 Advisor, 包含一个 Pointcut 与一个 advice
AspectJPointcutAdvisor Spring 解析 aop 命名空间时生成的 Advisor, 对于这个类的解析是在 ConfigBeanDefinitionParser
InstantiationModelAwarePointcutAdvisorImpl Spring解析被 @AspectJ注解注释的类时生成的 Advisor, 而这个 Advisor中的 Pointcut与Advice都是由 ReflectiveAspectJAdvisorFactory 来解析生成的
TransactionAttributeSourceAdvisor 一个基于 MethodInterceptor(其实是 TransactionInterceptor)与 TransactionAttributeSourcePointcut 的Advisor, 而这个类最常与 TransactionProxyFactoryBean使用
DefaultPointcutAdvisor 最常用的 Advisor, 在使用编程式aop时, 很多时候会将 Advice / MethodInterceptor 转换成 DefaultPointcutAdvisor
NameMatchMethodPointcutAdvisor 使用 NameMatchPointcutAdvisor时创建的 Advisor, 主要是通过 方法名来匹配是否执行 Advice
RegexpMethodPointcutAdvisor 基于正则表达式来匹配 Pointcut 的 Advisor, 其中的 Pointcut 默认是 JdkRegexpMethodPointcut

4. Adviced

类名 作用
ProxyFactory 这个类通过构造函数中的 proxyInterface/interceptor/targetSource 来创建代理对象(这个类是编程式 AOP 中最常用的对象)
ProxyFactoryBean 这个类是基于 FactoryBean 的 Proxy创建形式, 其通过代理的 Interface, targetSource 与指定的 interceptorNames 来创建对应的AopProxy, 最后生成对应的代理对象
AspectJProxyFactory 将一个被 @Aspect 注解标示的类丢入其中, 变创建了对应的代理对象

5. ProxyConfig

代理对象的配置属性。

public class ProxyConfig implements Serializable {
    //true:表示使用Cglib代理。false:表示使用JDK代理
    private boolean proxyTargetClass = false;
    //true:那么在生成代理对象之后,如果对代理配置进行了修改,已经创建的代理对象也不会获取修改之后的代理配置。
    //如果exposeProxy设置为true,那么optimize设置weitrue也会被忽略。
    private boolean optimize = false;
    //标记是否需要阻止通过该配置创建的代理对象转换为Advised类型,默认值为false,表示代理对象可以被转换为Advised类型
    boolean opaque = false;
    //标记代理对象是否可以被AopContext以ThreadLocal的形式暴露出去。
    boolean exposeProxy = false;
    //false:允许对代理对象进行修改(在Advisor链表中新增一个Advisor);true:不允许对代理对象进行修改。
    private boolean frozen = false;
}

文章参考

https://blog.csdn.net/f641385712/article/details/89312652

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,406评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,732评论 3 393
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,711评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,380评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,432评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,301评论 1 301
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,145评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,008评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,443评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,649评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,795评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,501评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,119评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,731评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,865评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,899评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,724评论 2 354

推荐阅读更多精彩内容

  • 通过schema形式使用spring aop时,spring提供了相应的拓展,可以解析自定义的标签。下面是基于sc...
    shallowinggg阅读 1,146评论 0 0
  • 概述 Spring是什么? Spring是一个开源框架,为了解决企业应用开发的复杂性而创建的,但是现在已经不止于企...
    琅筑阅读 1,168评论 2 8
  • title: Spring_AOP源码分析date: 2016-11-03 01:15:11categories:...
    raincoffee阅读 1,749评论 2 36
  • 1. Spring Aop 概述 AOP(Aspect-Oriented Programming) 面向切面编程,...
    爱吃鱼的KK阅读 1,210评论 1 5
  • 《國風·邶風·新臺》 新臺有泚,河水渳渳。燕婉之求,籧篨不鮮! 新臺有洒,河水浼浼。燕婉之求,籧篨不殄! 魚網之設...
    woshiliyana阅读 728评论 0 0