前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >spring aop (中下)创建代理

spring aop (中下)创建代理

作者头像
平凡的学生族
发布2019-06-03 08:47:09
4470
发布2019-06-03 08:47:09
举报
文章被收录于专栏:后端技术后端技术

参考

Spring AOP 创建代理的源码解析

判断代理方式

还是接着上面,AnnotationAwareAspectJAutoProxyCreator.postProcessAfterInitialization->wrapIfNecessary->createProxy内调用了proxyFactory.getProxy(getProxyClassLoader());(ProxyFactory.getProxy),getProxy内部调用了createAopProxy().getProxy(classLoader);也就是说,外界操作的都是getProxy的返回值,一个代理对象。代理对象的方法调用会被拦截。 所以我们分析createAopProxy(DefaultAopProxyFactory.createAopProxy),它在内部内有判断。 其中的:

代码语言:javascript
复制
if (targetClass.isInterface() || Proxy.isProxyClass(targetClass)) {
  return new JdkDynamicAopProxy(config);
}
return new ObjenesisCglibAopProxy(config);

说明,如果被代理的是接口,就用jdk,否则用cglib。也就是说,我们平时在Service实现类上加注解,则会用cglib。而mybatis根据mapper注册的Bean,是以MapperProxy生成的代理类对象,targetClass.isInterface()判断为假,但Proxy.isProxyClass(targetClass)判断为真,所以会用jdk。

最终,根据情况创建JdkDynamicAopProxy或ObjenesisCglibAopProxy对象

获取代理对象

在判断代理方式后,会创建JdkDynamicAopProxy或ObjenesisCglibAopProxy对象,并调用getProxy方法,获取代理对象。 ObjenesisCglibAopProxy对象会调用父类CglibAopProxy的getProxy方法。

如此,代理对象已创建。

两种代理对象

两种代理对象JdkDynamicAopProxy和ObjenesisCglibAopProxy,都会拦截外界的方法调用。 做一个合格的程序猿之浅析Spring AOP源码(十五) 分析JdkDynamicAopProxy的invoke方法

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019.06.02 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 参考
  • 判断代理方式
  • 获取代理对象
  • 两种代理对象
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档