当前位置: 首页 > 后端技术 > Java

SpringBoot如果服务@Transactional的方法不是公共的会发生什么?(3)

时间:2023-04-02 02:09:07 Java

SpringBoot如果服务@Transactional的方法不是公共的会发生什么?(2)我们在这篇文章中知道,no-publichat方法(其实是@Transactional修饰的方法^_^)不是代理类,那么什么时候更换代理类呢?图一确实是一开始执行的代理类~图二分析一下DynamicAdvisedInterceptor.intercept():布尔值setProxyContext=false;对象目标=空;TargetSourcetargetSource=this.advised.getTargetSource();try{if(this.advised.exposeProxy){//必要时使调用可用.oldProxy=AopContext.setCurrentProxy(proxy);真的;}//尽可能晚地获取以减少我们“拥有”目标的时间,以防它来自池...target=targetSource.getTarget();类targetClass=(target!=null?target.getClass():null);Listchain=this.advised.getInterceptorsAndDynamicInterceptionAdvice(method,targetClass);对象返回值;//这里判别目标方法不是publicif(chain.isEmpty()&&Modifier.isPublic(method.getModifiers())){//我们可以跳过创建MethodInvocation:直接调用目标。//请注意,最终调用者必须是一个InvokerInterceptor,因此我们知道//它只对目标执行反射操作,没有热//交换或花哨的代理。对象[]argsToUse=AopProxyUtils.adaptArgumentsIfNecessary(方法,args);retVal=methodProxy.invoke(target,argsToUse);}else{//因为不是public,需要执行这里retVal=newCglibMethodInvocation(proxy,目标,方法,args,targetClass,chain,methodProxy).proceed();}retVal=processReturnType(代理、目标、方法、retVal);返回值;}finally{if(target!=null&&!targetSource.isStatic()){targetSource.releaseTarget(target);}if(setProxyContext){//恢复旧的proxy.AopContext.setCurrentProxy(oldProxy);}}}最后调用CglibAopProxy.invokeJoinpoint();图3@OverrideprotectedObjectinvokeJoinpoint()throwsThrowable{//因为我们的方法不是publicif(this.publicMethod){returnthis.methodProxy.invoke(this.target,this.arguments);}else{//这里执行的所有逻辑returnsuper.invokeJoinpoint();}}其实就是ReflectiveMethodInvocation.invokeJoin观点();protectedObjectinvokeJoinpoint()throwsThrowable{//返回AopUtils.invokeJoinpointUsingReflection(this.target,this.method,this.arguments);}下面是target、method、arguments的具体取值:AopUtils.invokeJoinpointUsingReflection()核心逻辑是method.invoke(target,args),这样通过非代理类进行调用!

猜你喜欢