zoukankan      html  css  js  c++  java
  • SpringAOP[2]Advisor,Advice,Pointcut,Advised、ProxyConfig

    原文:SpringAOP联盟(1)—Advisor,Advice,Pointcut,Advised、ProxyConfig - 简书 (jianshu.com)

    代理对象生成

    @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();
    }

    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 通知

    // 有点标记接口的意思
    public interface Advice { }
    Advice通知 作用
    MethodBeforeAdvice 在目标方法执行之前执行。主要实现:AspectJMethodBeoreAdvice
    AfterReturningAdvice 在目标方法执行后执行,主要实现类:AspectJAfterAdviceAspectJAfterReturningAdviceAspectJAfterThrowingAdvice
    AspectJAroundAdvice 环绕通知

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

    @FunctionalInterface
    public interface MethodInterceptor extends Interceptor {
        // 被代理后的逻辑
        @Nullable
        Object invoke(@Nonnull MethodInvocation invocation) throws Throwable;
    }
    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. Advicor

    类名 作用
    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设置为true也会被忽略。
        private boolean optimize = false;
        //标记是否需要阻止通过该配置创建的代理对象转换为Advised类型,默认值为false,表示代理对象可以被转换为Advised类型
        boolean opaque = false;
        //标记代理对象是否可以被AopContext以ThreadLocal的形式暴露出去。
        boolean exposeProxy = false;
        //false:允许对代理对象进行修改(在Advisor链表中新增一个Advisor);true:不允许对代理对象进行修改。
        private boolean frozen = false;
    }
     
     
     
     
     
     
     
     
  • 相关阅读:
    canvas-绘制矩形-读书笔记
    获取页面路径中的参数
    微信小程序引用组件的方式
    this指向知识梳理
    for循环整理
    微信小程序使用wxs(小程序的一套脚本语言)
    textarea层级过高的解决办法
    防止用户连续点击按钮导致页面数据重复
    微信小程序tab切换
    HTML/CSS 知识点01 (转)
  • 原文地址:https://www.cnblogs.com/chenxingyang/p/15559337.html
Copyright © 2011-2022 走看看