如果代理对象是接口类型,则生成JdkDynamicAopProxy代理;否则生成ObjenesisCglibAopProxy代理,ObjenesisCglibAopProxy代理是继承于CglibAopProxy...下面先从熟悉的入手,选择JdkDynamicAopProxy分析。 构造器 查看源码,可以看到JdkDynamicAopProxy是一个final类,不能被继承和实现。...其实现了AopProxy, InvocationHandler, Serializable接口,如下所示: final class JdkDynamicAopProxy implements AopProxy..., InvocationHandler, Serializable 下面看看JdkDynamicAopProxy 构造器,源码如下: public JdkDynamicAopProxy(AdvisedSupport...JdkDynamicAopProxy 是final类并且实现了InvocationHandler 接口,那么也必然实现了invoke方法,其源码如下: @Override public
Created by Wang, Jerry, last modified on Aug 16, 2016
如果目标类是一个接口 || 或者目标类是一个代理类 if (targetClass.isInterface() || Proxy.isProxyClass(targetClass)) { //创建JdkDynamicAopProxy...return new JdkDynamicAopProxy(config); } //创建CglibAopProxy return new ObjenesisCglibAopProxy...(config); } else { //创建JdkDynamicAopProxy return new JdkDynamicAopProxy(config); } } 最终调用的是DefaultAopProxyFactory...#createAopProxy(...)方法,通过这个方法创建AopProxy 的实现类,如: JdkDynamicAopProxy,然后根据这个实现类再创建代理对象。...我们以JdkDynamicAopProxy为例,看下getProxy(classLoader): //JdkDynamicAopProxy.java public Object getProxy()
AdvisedSupport,所以在createAopProxy时将ProxyFactory中设置的targetSource、advice等传递到了DefaultAopProxyFactory,之后传递到JdkDynamicAopProxy...最后getProxy调用的是JdkDynamicAopProxy的getProxy方法,如下List-3所示,Proxy.newProxyInstance的方法中,最后的InvocationHandler...是this——JdkDynamicAopProxy实现了InvocationHandler,所以当我们调用目标类的方法时,会调用JdkDynamicAopProxy的invoke方法。...proxiedInterfaces); return Proxy.newProxyInstance(classLoader, proxiedInterfaces, this); } 这里就引出了一个问题,在JdkDynamicAopProxy
其中的: if (targetClass.isInterface() || Proxy.isProxyClass(targetClass)) { return new JdkDynamicAopProxy...最终,根据情况创建JdkDynamicAopProxy或ObjenesisCglibAopProxy对象 获取代理对象 在判断代理方式后,会创建JdkDynamicAopProxy或ObjenesisCglibAopProxy...两种代理对象 两种代理对象JdkDynamicAopProxy和ObjenesisCglibAopProxy,都会拦截外界的方法调用。...做一个合格的程序猿之浅析Spring AOP源码(十五) 分析JdkDynamicAopProxy的invoke方法
1.ProxyFactory getProxy()方法,依据我们对Proxy属性的设置,生成JdkDynamicAopProxy或者CglibAopProxy,我们这里分析JdkDynamicAopProxy...步骤7处,是JDK的动态代理,当我们调用方法时,实际执行的是JdkDynamicAopProxy的invoke方法。 步骤13处,将advice转为adviceInterceptor。...这里我们分析JdkDynamicAopProxy时候的场景。原图在Github上。 ?...步骤14,我们在调用被代理对象的方法时,调用的是JdkDynamicAopProxy的invoke(),之后的操作就和ProxyFactory的一样了,看上面ProxyFactory的分析。
它做了一个简单的逻辑判断:若实现类接口,使用JdkDynamicAopProxy最终去创建,否则交给ObjenesisCglibAopProxy。..., Serializable { private static final Log logger = LogFactory.getLog(JdkDynamicAopProxy.class); /...otherProxy; if (other instanceof JdkDynamicAopProxy) { otherProxy = (JdkDynamicAopProxy) other;...(ih instanceof JdkDynamicAopProxy)) { return false; } otherProxy = (JdkDynamicAopProxy) ih;...总结 JdkDynamicAopProxy 入口方法是动态代理的 invoke() 方法,CGLIB 使用的是 DynamicAdvisedInterceptor.intercept()方法 JdkDynamicAopProxy
代理对象中包括增强方法和被代理对象 下面简单了解下Spring AOP中核心的接口类 InvocationHandler 接口,从字面不难理解是调用处理器的意思,该接口是一个祖宗级接口,大多动态代理接口都会实现它,如JdkDynamicAopProxy...只有三个实现类CglibAopProxy、JdkDynamicAopProxy、ObjenesisCglibAopProxy,接口内部只定义了两个方法 Object getProxy(); Object...DefaultAopProxyFactory实现了接口中的createAopProxy方法,定义了何时使用JdkDynamicAopProxy、何时使用ObjenesisCglibAopProxy代理。...if (targetClass.isInterface() || Proxy.isProxyClass(targetClass)) { return new JdkDynamicAopProxy...} return new ObjenesisCglibAopProxy(config); } else { return new JdkDynamicAopProxy
断点执行到方法上时,我们可以发现注入的customerDao对象,本质上是通过JdkDynamicAopProxy生成的一个代理对象 代理对象中方法调用的分析 当程序执行的时候,会通过JdkDynamicAopProxy...答案很简单,都隐藏在通过JdkDynamicAopProxy生成的动态代理对象当中,而这个动态代理对象就是SimpleJpaRepository ?
if (targetClass.isInterface() || Proxy.isProxyClass(targetClass)) { return new JdkDynamicAopProxy...ObjenesisCglibAopProxy(config); } else { //使用jdk动态代理 return new JdkDynamicAopProxy...(config); } } 另外AopProxy也是一个策略接口类,具体实现的策略为JdkDynamicAopProxy,CglibAopProxy,ObjenesisCglibAopProxy
参考 做一个合格的程序猿之浅析Spring AOP源码(十五) 分析JdkDynamicAopProxy的invoke方法 1....JdkDynamicAopProxy 1.1 invoke 之前我们说到,当使用jdk动态代理时,会调用该类的getProxy方法生成一个代理对象,返回给外界调用。...final class JdkDynamicAopProxy implements AopProxy, InvocationHandler, Serializable { @Nullable...介绍advised: 成员变量JdkDynamicAopProxy.advised是AdvisedSupport类型,它是一个配置类,是用来设置代理的,其内有各种配置参数。...请看下面我已经整理好的代码: // JdkDynamicAopProxy.java public JdkDynamicAopProxy(AdvisedSupport config) throws AopConfigException
在这个上面,无论是JdkDynamicAopProxy动态代理,还是ObjenesisCglibAopProxy代理,他们都 implements 了AopProxy这个接口类,也是一种抽象工厂模式。...因此无论是返回JdkDynamicAopProxy对象,还是返回ObjenesisCglibAopProxy对象,都可以使用AopProxy这个接口类作为统一的返回类型。...if (targetClass.isInterface() || Proxy.isProxyClass(targetClass)) { return new JdkDynamicAopProxy...} return new ObjenesisCglibAopProxy(config); } else { return new JdkDynamicAopProxy
/ 先获取 AOP 代理工厂,默认为 DefaultAopProxyFactory,只有这个实现 // 然后通过它根据创建当前 AdvisedSupport 配置管理器创建一个 AOP 代理(JdkDynamicAopProxy...proxy creation."); } // 如果目标类是一个接口或者是 java.lang.reflect.Proxy 的子类 则还是使用 JDK 动态代理,创建一个 JdkDynamicAopProxy...if (targetClass.isInterface() || Proxy.isProxyClass(targetClass)) { return new JdkDynamicAopProxy...配置管理器,并返回 return new ObjenesisCglibAopProxy(config); } else { // 使用 JDK 动态代理,创建一个 JdkDynamicAopProxy...对象,传入 AdvisedSupport 配置管理器,并返回 return new JdkDynamicAopProxy(config); } } 源码分析 在这个DefaultAopProxyFactory
org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) at org.springframework.aop.framework.JdkDynamicAopProxy.invoke...(JdkDynamicAopProxy.java:212) at com.sun.proxy.
org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171) org.springframework.aop.framework.JdkDynamicAopProxy.invoke...(JdkDynamicAopProxy.java:204) com.sun.proxy.
."); } if (targetClass.isInterface() || Proxy.isProxyClass(targetClass)) { return new JdkDynamicAopProxy...(config); } return new ObjenesisCglibAopProxy(config); } else { return new JdkDynamicAopProxy
这里分析使用JDK动态代理的方式,进入JdkDynamicAopProxy.getProxy方法。 ? 可以看到很熟悉的创建代理的代码Proxy.newProxyInstance。...这里要注意的是,newProxyInstance方法的最后一个参数是JdkDynamicAopProxy类本身,也就是说在对目标类进行调用的时候,会进入JdkDynamicAopProxy的invoke...这里只关注JdkDynamicAopProxy的invoke方法的重点代码。 ?
JDK动态代理以及CGLIB代理这两种生成代理对象的方式在Spring AOP中分别对应两个类:JdkDynamicAopProxy和CglibAopProxy,而AopProxy是这两个类的父接口。...1 //①首先查看JdkDynamicAopProxy类的成员变量 2 final class JdkDynamicAopProxy implements AopProxy, InvocationHandler...1 //②再来看看JdkDynamicAopProxy类的构造方法 2 public JdkDynamicAopProxy(AdvisedSupport config) throws AopConfigException...JdkDynamicAopProxy就实现了InvocationHandler接口,这个接口只有一个方法invoke。...接下来一步一步查看JdkDynamicAopProxy是如何实现invoke方法的。
."); } if (targetClass.isInterface()) { return new JdkDynamicAopProxy(config); } return...CglibProxyFactory.createCglibProxy(config); } else { return new JdkDynamicAopProxy(config);...再看看JdkDynamicAopProxy中的getProxy public Object getProxy(ClassLoader classLoader) { if (logger.isDebugEnabled
."); } if (targetClass.isInterface()) { return new JdkDynamicAopProxy(config); } return CglibProxyFactory.createCglibProxy...(config); } else { return new JdkDynamicAopProxy(config); } } 如果isOptimize()返回true,或者proxyTargetClass...再看看JdkDynamicAopProxy中的getProxy public Object getProxy(ClassLoader classLoader) { if (logger.isDebugEnabled
领取专属 10元无门槛券
手把手带您无忧上云