zoukankan      html  css  js  c++  java
  • Spring学习笔记(二)AOP

    一.概论

    AOP

    从图上可以看出,Spring AOP的所有概念基本分为三块:

    第一块(左上角)为AOP配置,主要包含ProxyConfig,AdvisedSupport,这些配置包含AOP主要概念如target(目的对象),Advisors(切入点及其对应的增强)构成的处理链。

    第二块为(右上角)AOPProxyFactory这主要是沿用了spring的主要思想即构造主要都采用factoryBean封装,可以生成不同的AopProxy,如Cglib2AopProxy,JdkDynamicProxy.

    第三块(下方)为代理逻辑,包含Spring的InvocationHandler实现JdkDynamicProxy(主要实现调用拦截增强过程),Proxy(可根据InvocationHandler,目标对象实现接口生成代理类$Proxy0,$Proxy0为生成的代理类。

    二、JDKDynamicProxy生成代理类$Proxy0分析:

    1. 类组成部分:

    • 构造函数$Proxy0(InvocationHandler h)。
    • 成员变量InvocationHandler h
    • static Method m1,m2,m3,…,mn等储存所有target实现接口的Method类型的字段。
    • 方法 所有target实现接口内声明的方法。

    2. 实现代理原理:

    在static方法块中会将所有的接口中的所有方法全部给得到,并储存在m1,m2,m3,...,mn字段中,并且会生成接口中所有的方法.方法的实现为调用其作为成员变量的InvocationHander的invoke(Object proxy,Method method,Object[]args)方法,将参数和方法字段mn传入,进行调用。而一般来说target目标对象会调用相应的method,在这个调用过程中就会使用Advisor的责任链来进行多余特性的植入。

    三、调用增强过程:

    以JDKDynamicProxy为例:

    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable

    1. 从advised中得到targetSource。

    2. 从advised中得到所有的Chain

    org.springframework.aop.framework.DefaultAdvisorChainFactory

    public List<Object> getInterceptorsAndDynamicInterceptionAdvice(

    Advised config, Method method, Class targetClass)

    hasIntroductions 没有

    循环访问config中所有的Adivisors

    如果Advisor是PointcutAdvisor

    看这个Advisor是否满足ClassFilter

    将Advisor转换成MethodInterceptor

    是则匹配方法从Pointcut中取MethodMatcher,使用MethodMatcher来匹配方法

    3. 如果chain是空的,retVal = AopUtils.invokeJoinpointUsingReflection(target, method, args);

    // We need to create a method invocation...

    invocation = new ReflectiveMethodInvocation(proxy, target, method, args, targetClass, chain);

    // Proceed to the joinpoint through the interceptor chain.

    retVal = invocation.proceed();

  • 相关阅读:
    Spring注释事务失效及解决办法
    在使用springMVC时,我使用了@Service这样的注解,发现使用注解@Transactional声明的事务不起作用
    如何在Oracle中复制表结构和表数据
    Tomcat Deployment failure ,locked one or more files
    java中对List中对象排序实现
    HDU 5002 Tree LCT 区间更新
    2014-2015 ACM-ICPC, Asia Xian Regional Contest G The Problem to Slow Down You 回文树
    Codeforces Round #323 (Div. 1) B. Once Again... 暴力
    Codeforces Round #323 (Div. 2) C. GCD Table 暴力
    hdu 5497 Inversion 树状数组 逆序对,单点修改
  • 原文地址:https://www.cnblogs.com/jinspire/p/3064095.html
Copyright © 2011-2022 走看看