首页 > 其他分享 >SpringAop是使用JDK代理还是使用CGLIB代理实现

SpringAop是使用JDK代理还是使用CGLIB代理实现

时间:2022-11-22 18:44:07浏览次数:59  
标签:false JDK 代理 接口 CGLIB ifc true class

先说结论:在spring-aop的默认逻辑中,aop默认优先使用JDK代理,前提是目标对象是基于接口的实现类。
源码如下:入口在AbstractAdvisingBeanPostProcessor.postProcessAfterInitialization(Object bean, String beanName)中

其中ProxyFactory继承自ProxyCreatorSupport:
image

而AopProxyFactory只有一个默认实现:DefaultAopProxyFactory,其中创建代理对象的核心方法为createAopProxy():

NativeDetector.inNativeImage() :是否使用GVM编译,一般为false;
config.isOptimize():代理是否应该执行积极优化,私有默认值为false;
config.isProxyTargetClass():是否是基于类的代理,如果想使用cglib代理,则设此值为true,默认为false;
hasNoUserSuppliedProxyInterfaces():如果存在一个接口,还是SpringProxy类型的,就返回true,否则就是false,自定义的肯定是false,如果没接口也是false。一般为false;

所以第一个循环条件在大多数情况下判断的依据是config.isProxyTargetClass(),proxyTargetClass是可以手动设置的(xml配置中指定proxy-target-class = "true" 或者使用注解@EnableAspectJAutoProxy(proxyTargetClass = true)),但一般情况下不会去设置它,而是由ProxyProcessorSupport.evaluateProxyInterfaces()去处理它的值。
image
如果目标对象没有基于接口的实现,便不会经此循环,hasReasonableProxyInterface会为false,proxyTargetClass会被设为true。
isConfigurationCallbackInterface(ifc):一般为false,是否包含以下接口的实现,InitializingBean.class,DisposableBean.class,Closeable.class ,AutoCloseable.class ,ObjectUtils.containsElement(ifc.getInterfaces(), Aware.class);
isInternalLanguageInterface(ifc):一般为false,是否是内部语言接口,ifc.getName().equals("groovy.lang.GroovyObject") || ifc.getName().endsWith(".cglib.proxy.Factory") || ifc.getName().endsWith(".bytebuddy.MockAccess");
所以(!isConfigurationCallbackInterface(ifc) && !isInternalLanguageInterface(ifc) && ifc.getMethods().length > 0 )一般为true;

标签:false,JDK,代理,接口,CGLIB,ifc,true,class
From: https://www.cnblogs.com/lzxulxy/p/16916051.html

相关文章

  • LAB-15:Sidecar代理
    LAB-15:Sidecar代理LAB概述添加一个名为 busybox 且镜像为 busybox 的 sidecar 到一个已经存在的名为 legacy-app 的 Pod 上,这个 sidecar 的启动命令为 /bi......
  • go模拟实现反向代理各种算法
    packageutiltypeHttpServerstruct{HoststringWeightint}typeLoadBalancestruct{Server[]*HttpServerCurrentIndexint}varMapWeight[]intfunc......
  • 1.go做反向代理
    后端服务器代码packagemainimport("log""net/http""os""os/signal")typewebHandlerstruct{}func(webHandler)ServeHTTP(whttp.ResponseWriter,re......
  • java8 (jdk 1.8) 新特性——Stream ApI
    在java8中,有两个最重要的改变,一个就是之前了解的Lmbda java8(jdk1.8)新特性——Lambda ,还有一个就是StreamApi 1.什么是StreamAPI 简单来说就是一个类库,里边......
  • Nginx 代理 jira 和 confluence
    jira和confluence想部署到同一台机器上。都使用80端口访问。使用nginx代理吧。直接使用proxy_passhttp://127.0.0.1:8080jira的首页小插件不太好使。发现使用tr......
  • JDK 的安装
    1.官网下载  https://www.oracle.com/java/technologies/downloads/#jdk17-windows  2.安装 最好不要用中文路径 直接下一步下一步就可以了   3.新建H......
  • Java配置jdk环境变量
     配置:1、进入系统环境变量设置。  2、点击环境变量 3、如图所示:  4、如图所示:   5、点击确定退出配置界面检验:1、win+r,输入cmd,点击确定。 ......
  • 温故而知新——jdk8后新增的时间类
    jdk8后新增的时间类:LocalTimeLocalDateLocalDateTime:LocalDateTime可以转化成其他2类时间:三个工具类Duration:用于计算2个“时间间隔”(秒,纳秒)Period:用于计算2......
  • frp代理windows远程桌面
    前言参考地址:​​https://geomatlab.com/frp-windows-rdp/​​正文备忘远程的电脑在登录时会输入用户名和密码,这个用户名有可能不是被远程电脑上显示的用户名,我们需要在被远......
  • HTTP代理提取时应注意些什么
    很多人在提取HTTP代理时,经常会遇这样那样的问题,使用情况总是不尽如人意,其实HTTP代理提取的时候,有一些注意事项总是会被人忽视,到底是什么呢?让我们来看一下看吧。1......