SOFABoot源码解析之JVM服务代理机制

SE (3) -Transformers:三维旋转 - 平移等变注意力网络 E (3) 变换器,这是一种用于三维点云和图的自注意力模块变体,在连续三维旋转平移下具有等变性。注意力机制的计算量会随着点云规模的增大呈二次方增长,因此引入邻域的概念是很有必要的:每个点不再关注所有其他点,而只关注其最近的邻点。注意力机制此前已在图的领域中以内部注意力、自注意力、顶点注意力或图注意力等名称被引入 [17, 31, 32, 12, 26]。等变性意味着当输入数据发生旋转或平移时,模型的输出也会以相应的、可预测的方式进行变换,从而保证模型性能的稳定性和可预测性。 阅读详情

1.SOFABoot源码解析

1.1  JVM服务代理机制

        在SOFABoot中,采用AOP代理方式为JVM服务引用创建本地代理对象。对于AOP代理,主要有两种实现方式:

        1.   针对实现接口的类,采用JDK动态代理机制;

        2.   针对没有实现接口的类,采用CGLIB动态代理机制;

        在SOFABoot中,对于JVM服务类型的服务引用,即可以针对某个接口创建代理对象,也可以针对某个类创建代理对象。

1.1.1 AOP代理之JDK动态代理

        针对接口(例如:com.alipay.sofa.boot.examples.demo.rpc.bean.PersonService接口),为其创建JVM服务的AOP代理对象的主要逻辑如下:

        1.   创建handler,此处为ServiceProxy抽象类的子类JvmServiceInvoker的实例。该类继承了ServiceProxy,而ServiceProxy实现了org.aopalliance.intercept.MethodInterceptor接口,表示此处创建AOP代理的方法拦截器。该AOP代理拦截器拦截对proxyClass指定的接口(例如: PersonService)的方法调用。

        2.   创建AOP代理工厂类org.springframework.aop.framework.ProxyFactory的实例factory;

        3.   配置factory:如果javaClass为接口,则factory的interfaces列表中增加javaClass。否则,设置factory的targetClass为javaClass,proxyTarget为true。

        4.   把指定的AOP advice实例handler增加到advice链尾部。

        5.   调用factory的getProxy方法,为指定服务创建AOP代理对象。由于此处目标类是接口,则使用JDK动态代理技术。Spring使用JDK来生成代理对象,具体的实现代码放在org.springframework.aop.framework.JdkDynamicAopProxy这个类中。JdkDynamicAopProxy 同时实现了AopProxy和InvocationHandler接口,InvocationHandler是JDK动态代理的核心,生成的代理对象的方法调用都会委托到InvocationHandler.invoke()方法。invoke主流程可以简述为:获取可以应用到此方法上的通知链(InterceptorChain),如果有,则应用通知,并执行joinpoint;如果通知链为空,则直接反射执行joinpoint。

        以上是使用JDK动态代理机制动态创建JVM服务的AOP代理对象的主要流程。

        为了查看Proxy动态生成的代理对象的源文件,必须先导出字节码文件,然后通过反编译工具(如:jad)生成源文件。对于Proxy,导出字节码文件方式为在应用代码开始位置设置sun.misc.ProxyGenerator.saveGeneratedFiles为true:

1.  @SpringBootApplication
2.  @ImportResource({"classpath*:rpc-starter-example.xml" })
3.  public class SofaBootRpcDemoApplication {
4.   
5.      public static void main(String[] args)throws InterruptedException {
6.       
7.        System.getProperties().put("sun.misc.ProxyGenerator.saveGeneratedFiles","true");
8.       
9.        ConfigurableApplicationContext ac =SpringApplication.run(SofaBootRpcDemoApplication.class, args);
10.          
11.  
12.     }
13. }

        注意,需要在工程根目录下,增加 com/sun/proxy目录,否则会报错如下:

1.  Exception in thread "main"java.lang.InternalError: I/O exception saving generatedfile:java.io.FileNotFoundException : com\sun\proxy\$Proxy0.class (系统找不到指定的路径。)
2.       atsun.misc.ProxyGenerator$1.run(ProxyGenerator.java:336 )
3.       atsun.misc.ProxyGenerator$1.run(ProxyGenerator.java:327 )
4.       atjava.security.AccessController.doPrivileged( Native Method)
5.       atsun.misc.ProxyGenerator.generateProxyClass( ProxyGenerator.java:326)
6.       atjava.lang.reflect.Proxy$ProxyClassFactory.apply( Proxy.java:672)
7.       atjava.lang.reflect.Proxy$ProxyClassFactory.apply( Proxy.java:592)
8.       atjava.lang.reflect.WeakCache$Factory.get( WeakCache.java:244)
9.       atjava.lang.reflect.WeakCache.get(WeakCache.java:141 )
10.      at java.lang.reflect.Proxy.getProxyClass0(Proxy.java:455 )
11.      atjava.lang.reflect.Proxy.newProxyInstance( Proxy.java:738)

        以下为PersonService接口的AOP代理对象的源文件:

1.  package com.sun.proxy;
2.   
3.  importcom.alipay.sofa.boot.examples.demo.rpc.bean.PersonService;
4.  import java.lang.reflect.InvocationHandler;
5.  import java.lang.reflect.Method;
6.  import java.lang.reflect.Proxy;
7.  importjava.lang.reflect.UndeclaredThrowableException;
8.  import org.aopalliance.aop.Advice;
9.  import org.springframework.aop.Advisor;
10. import org.springframework.aop.SpringProxy;
11. importorg.springframework.aop.TargetSource;
12. importorg.springframework.aop.framework.Advised;
13. importorg.springframework.aop.framework.AopConfigException;
14. importorg.springframework.core.DecoratingProxy;
15.  
16. public final class $Proxy50 extends Proxy
17.   implementsPersonService, SpringProxy, Advised, DecoratingProxy
18. {
19.   private static Method m19;
20.   private static Method m15;
21.   private static Method m27;
22.   private static Method m6;
23.   private static Method m2;
24.   private static Method m25;
25.   private static Method m24;
26.   private static Method m11;
27.   private static Method m4;
28.   private static Method m26;
29.   private static Method m8;
30.   private static Method m22;
31.   private static Method m20;
32.   private static Method m21;
33.   private static Method m16;
34.   private static Method m9;
35.   private static Method m23;
36.   private static Method m5;
37.   private static Method m12;
38.   private static Method m13;
39.   private static Method m1;
40.   private static Method m18;
41.   private static Method m10;
42.   private static Method m17;
43.   private static Method m3;
44.   private static Method m0;
45.   private static Method m7;
46.   private static Method m14;
47.  
48.   public $Proxy50(InvocationHandlerparamInvocationHandler)
49.     throws
50.   {
51.     super(paramInvocationHandler);
52.   }
53.  
54.   public final boolean isPreFiltered()
55.     throws
56.   {
57.     try
58.     {
59.       return ((Boolean)this.h.invoke(this, m19,null)).booleanValue();
60.     }
61.     catch (RuntimeExceptionlocalRuntimeException)
62.     {
63.       throw localRuntimeException;
64.     }
65.     catch (Throwable localThrowable)
66.     {
67.     }
68.     throw newUndeclaredThrowableException(localThrowable);
69.   }
70.  
71.   public final boolean isProxyTargetClass()
72.     throws
73.   {
74.     try
75.     {
76.       return ((Boolean)this.h.invoke(this, m15,null)).booleanValue();
77.     }
78.     catch (RuntimeException localRuntimeException)
79.     {
80.       throw localRuntimeException;
81.     }
82.     catch (Throwable localThrowable)
83.     {
84.     }
85.     throw newUndeclaredThrowableException(localThrowable);
86.   }
87.  
88.   public final Class getDecoratedClass()
89.     throws
90.   {
91.     try
92.     {
93.       return (Class)this.h.invoke(this, m27,null);
94.     }
95.     catch (RuntimeExceptionlocalRuntimeException)
96.     {
97.       throw localRuntimeException;
98.     }
99.     catch (Throwable localThrowable)
100.     {
101.     }
102.     throw newUndeclaredThrowableException(localThrowable);
103.   }
104.  
105.   public final boolean isFrozen()
106.     throws
107.   {
108.     try
109.     {
110.       return ((Boolean)this.h.invoke(this, m6,null)).booleanValue();
111.     }
112.     catch (RuntimeExceptionlocalRuntimeException)
113.     {
114.       throw localRuntimeException;
115.     }
116.     catch (Throwable localThrowable)
117.     {
118.     }
119.     throw newUndeclaredThrowableException(localThrowable);
120.   }
121.  
122.   public final String toString()
123.     throws
124.   {
125.     try
126.     {
127.       return (String)this.h.invoke(this, m2,null);
128.     }
129.     catch (RuntimeException localRuntimeException)
130.     {
131.       throw localRuntimeException;
132.     }
133.     catch (Throwable localThrowable)
134.     {
135.     }
136.     throw newUndeclaredThrowableException(localThrowable);
137.   }
138.  
139.   public final boolean removeAdvice(AdviceparamAdvice)
140.     throws
141.   {
142.     try
143.     {
144.       return ((Boolean)this.h.invoke(this, m25,new Object[] { paramAdvice })).booleanValue();
145.     }
146.     catch (RuntimeExceptionlocalRuntimeException)
147.     {
148.       throw localRuntimeException;
149.     }
150.     catch (Throwable localThrowable)
151.     {
152.     }
153.     throw newUndeclaredThrowableException(localThrowable);
154.   }
155.  
156.   public final boolean removeAdvisor(AdvisorparamAdvisor)
157.     throws
158.   {
159.     try
160.     {
161.       return ((Boolean)this.h.invoke(this, m24,new Object[] { paramAdvisor })).booleanValue();
162.     }
163.     catch (RuntimeExceptionlocalRuntimeException)
164.     {
165.       throw localRuntimeException;
166.     }
167.     catch (Throwable localThrowable)
168.     {
169.     }
170.     throw newUndeclaredThrowableException(localThrowable);
171.   }
172.  
173.   public final void setExposeProxy(booleanparamBoolean)
174.     throws
175.   {
176.     try
177.     {
178.       this.h.invoke(this, m11, new Object[] {Boolean.valueOf(paramBoolean) });
179.       return;
180.     }
181.     catch (RuntimeExceptionlocalRuntimeException)
182.     {
183.       throw localRuntimeException;
184.     }
185.     catch (Throwable localThrowable)
186.     {
187.     }
188.     throw newUndeclaredThrowableException(localThrowable);
189.   }
190.  
191.   public final int indexOf(AdvisorparamAdvisor)
192.     throws
193.   {
194.     try
195.     {
196.       return ((Integer)this.h.invoke(this, m4,new Object[] { paramAdvisor })).intValue();
197.     }
198.     catch (RuntimeExceptionlocalRuntimeException)
199.     {
200.       throw localRuntimeException;
201.     }
202.     catch (Throwable localThrowable)
203.     {
204.     }
205.     throw newUndeclaredThrowableException(localThrowable);
206.   }
207.  
208.   public final Class getTargetClass()
209.     throws
210.   {
211.     try
212.     {
213.       return (Class)this.h.invoke(this, m26,null);
214.     }
215.     catch (RuntimeExceptionlocalRuntimeException)
216.     {
217.       throw localRuntimeException;
218.     }
219.     catch (Throwable localThrowable)
220.     {
221.     }
222.     throw new UndeclaredThrowableException(localThrowable);
223.   }
224.  
225.   public final TargetSource getTargetSource()
226.     throws
227.   {
228.     try
229.     {
230.       return (TargetSource)this.h.invoke(this,m8, null);
231.     }
232.     catch (RuntimeExceptionlocalRuntimeException)
233.     {
234.       throw localRuntimeException;
235.     }
236.     catch (Throwable localThrowable)
237.     {
238.     }
239.     throw newUndeclaredThrowableException(localThrowable);
240.   }
241.  
242.   public final void addAdvisor(int paramInt,Advisor paramAdvisor)
243.     throws AopConfigException
244.   {
245.     try
246.     {
247.       this.h.invoke(this, m22, new Object[] {Integer.valueOf(paramInt), paramAdvisor });
248.       return;
249.     }
250.     catch (RuntimeExceptionlocalRuntimeException)
251.     {
252.       throw localRuntimeException;
253.     }
254.     catch (Throwable localThrowable)
255.     {
256.     }
257.     throw newUndeclaredThrowableException(localThrowable);
258.   }
259.  
260.   public final boolean isExposeProxy()
261.     throws
262.   {
263.     try
264.     {
265.       return ((Boolean)this.h.invoke(this, m20,null)).booleanValue();
266.     }
267.     catch (RuntimeException localRuntimeException)
268.     {
269.       throw localRuntimeException;
270.     }
271.     catch (Throwable localThrowable)
272.     {
273.     }
274.     throw newUndeclaredThrowableException(localThrowable);
275.   }
276.  
277.   public final void addAdvisor(AdvisorparamAdvisor)
278.     throws AopConfigException
279.   {
280.     try
281.     {
282.       this.h.invoke(this, m21, new Object[] {paramAdvisor });
283.       return;
284.     }
285.     catch (RuntimeExceptionlocalRuntimeException)
286.     {
287.       throw localRuntimeException;
288.     }
289.     catch (Throwable localThrowable)
290.     {
291.     }
292.     throw newUndeclaredThrowableException(localThrowable);
293.   }
294.  
295.   public final void addAdvice(int paramInt,Advice paramAdvice)
296.     throws AopConfigException
297.   {
298.     try
299.     {
300.       this.h.invoke(this, m16, new Object[] {Integer.valueOf(paramInt), paramAdvice });
301.       return;
302.     }
303.     catch (RuntimeExceptionlocalRuntimeException)
304.     {
305.       throw localRuntimeException;
306.     }
307.     catch (Throwable localThrowable)
308.     {
309.     }
310.     throw newUndeclaredThrowableException(localThrowable);
311.   }
312.  
313.   public final Class[] getProxiedInterfaces()
314.     throws
315.   {
316.     try
317.     {
318.       return (Class[])this.h.invoke(this, m9,null);
319.     }
320.     catch (RuntimeExceptionlocalRuntimeException)
321.     {
322.       throw localRuntimeException;
323.     }
324.     catch (Throwable localThrowable)
325.     {
326.     }
327.     throw newUndeclaredThrowableException(localThrowable);
328.   }
329.  
330.   public final void removeAdvisor(int paramInt)
331.     throws AopConfigException
332.   {
333.     try
334.     {
335.       this.h.invoke(this, m23, new Object[] {Integer.valueOf(paramInt) });
336.       return;
337.     }
338.     catch (RuntimeExceptionlocalRuntimeException)
339.     {
340.       throw localRuntimeException;
341.     }
342.     catch (Throwable localThrowable)
343.     {
344.     }
345.     throw newUndeclaredThrowableException(localThrowable);
346.   }
347.  
348.   public final int indexOf(Advice paramAdvice)
349.     throws
350.   {
351.     try
352.     {
353.       return ((Integer)this.h.invoke(this, m5,new Object[] { paramAdvice })).intValue();
354.     }
355.     catch (RuntimeExceptionlocalRuntimeException)
356.     {
357.       throw localRuntimeException;
358.     }
359.     catch (Throwable localThrowable)
360.     {
361.     }
362.     throw newUndeclaredThrowableException(localThrowable);
363.   }
364.  
365.   public final void setPreFiltered(booleanparamBoolean)
366.     throws
367.   {
368.     try
369.     {
370.       this.h.invoke(this, m12, new Object[] {Boolean.valueOf(paramBoolean) });
371.       return;
372.     }
373.     catch (RuntimeExceptionlocalRuntimeException)
374.     {
375.       throw localRuntimeException;
376.     }
377.     catch (Throwable localThrowable)
378.     {
379.     }
380.     throw newUndeclaredThrowableException(localThrowable);
381.   }
382.  
383.   public final boolean replaceAdvisor(AdvisorparamAdvisor1, Advisor paramAdvisor2)
384.     throws AopConfigException
385.   {
386.     try
387.     {
388.       return ((Boolean)this.h.invoke(this, m13,new Object[] { paramAdvisor1, paramAdvisor2 })).booleanValue();
389.     }
390.     catch (RuntimeException localRuntimeException)
391.     {
392.       throw localRuntimeException;
393.     }
394.     catch (Throwable localThrowable)
395.     {
396.     }
397.     throw newUndeclaredThrowableException(localThrowable);
398.   }
399.  
400.   public final boolean equals(ObjectparamObject)
401.     throws
402.   {
403.     try
404.     {
405.       return ((Boolean)this.h.invoke(this, m1,new Object[] { paramObject })).booleanValue();
406.     }
407.     catch (RuntimeExceptionlocalRuntimeException)
408.     {
409.       throw localRuntimeException;
410.     }
411.     catch (Throwable localThrowable)
412.     {
413.     }
414.     throw newUndeclaredThrowableException(localThrowable);
415.   }
416.  
417.   public final Advisor[] getAdvisors()
418.     throws
419.   {
420.     try
421.     {
422.       return (Advisor[])this.h.invoke(this,m18, null);
423.     }
424.     catch (RuntimeExceptionlocalRuntimeException)
425.     {
426.       throw localRuntimeException;
427.     }
428.     catch (Throwable localThrowable)
429.     {
430.     }
431.     throw newUndeclaredThrowableException(localThrowable);
432.   }
433.  
434.   public final boolean isInterfaceProxied(ClassparamClass)
435.     throws
436.   {
437.     try
438.     {
439.       return ((Boolean)this.h.invoke(this, m10,new Object[] { paramClass })).booleanValue();
440.     }
441.     catch (RuntimeExceptionlocalRuntimeException)
442.     {
443.       throw localRuntimeException;
444.     }
445.     catch (Throwable localThrowable)
446.     {
447.     }
448.     throw new UndeclaredThrowableException(localThrowable);
449.   }
450.  
451.   public final void addAdvice(AdviceparamAdvice)
452.     throws AopConfigException
453.   {
454.     try
455.     {
456.       this.h.invoke(this, m17, new Object[] {paramAdvice });
457.       return;
458.     }
459.     catch (RuntimeException localRuntimeException)
460.     {
461.       throw localRuntimeException;
462.     }
463.     catch (Throwable localThrowable)
464.     {
465.     }
466.     throw newUndeclaredThrowableException(localThrowable);
467.   }
468.  
469.   publicfinal String sayName(String paramString)
470.     throws
471.   {
472.     try
473.     {
474.       return (String)this.h.invoke(this, m3,new Object[] { paramString });
475.     }
476.     catch (RuntimeExceptionlocalRuntimeException)
477.     {
478.       throw localRuntimeException;
479.     }
480.     catch (Throwable localThrowable)
481.     {
482.     }
483.     throw new UndeclaredThrowableException(localThrowable);
484.   }
485.  
486.   public final int hashCode()
487.     throws
488.   {
489.     try
490.     {
491.       return ((Integer)this.h.invoke(this, m0,null)).intValue();
492.     }
493.     catch (RuntimeExceptionlocalRuntimeException)
494.     {
495.       throw localRuntimeException;
496.     }
497.     catch (Throwable localThrowable)
498.     {
499.     }
500.     throw newUndeclaredThrowableException(localThrowable);
501.   }
502.  
503.   public final voidsetTargetSource(TargetSource paramTargetSource)
504.     throws
505.   {
506.     try
507.     {
508.       this.h.invoke(this, m7, new Object[] {paramTargetSource });
509.       return;
510.     }
511.     catch (RuntimeExceptionlocalRuntimeException)
512.     {
513.       throw localRuntimeException;
514.     }
515.     catch (Throwable localThrowable)
516.     {
517.     }
518.     throw newUndeclaredThrowableException(localThrowable);
519.   }
520.  
521.   public final String toProxyConfigString()
522.     throws
523.   {
524.     try
525.     {
526.       return (String)this.h.invoke(this, m14,null);
527.     }
528.     catch (RuntimeExceptionlocalRuntimeException)
529.     {
530.       throw localRuntimeException;
531.     }
532.     catch (Throwable localThrowable)
533.     {
534.     }
535.     throw newUndeclaredThrowableException(localThrowable);
536.   }
537.  
538.   static
539.   {
540.     try
541.     {
542.       m19 =Class.forName("org.springframework.aop.framework.Advised").getMethod("isPreFiltered",new Class[0]);
543.       m15 = Class.forName("org.springframework.aop.framework.Advised").getMethod("isProxyTargetClass",new Class[0]);
544.       m27 =Class.forName("org.springframework.core.DecoratingProxy").getMethod("getDecoratedClass",new Class[0]);
545.       m6 = Class.forName("org.springframework.aop.framework.Advised").getMethod("isFrozen",new Class[0]);
546.       m2 =Class.forName("java.lang.Object").getMethod("toString", newClass[0]);
547.       m25 =Class.forName("org.springframework.aop.framework.Advised").getMethod("removeAdvice",new Class[] { Class.forName("org.aopalliance.aop.Advice") });
548.       m24 =Class.forName("org.springframework.aop.framework.Advised").getMethod("removeAdvisor",new Class[] { Class.forName("org.springframework.aop.Advisor") });
549.       m11 = Class.forName("org.springframework.aop.framework.Advised").getMethod("setExposeProxy",new Class[] { Boolean.TYPE });
550.       m4 =Class.forName("org.springframework.aop.framework.Advised").getMethod("indexOf",new Class[] { Class.forName("org.springframework.aop.Advisor") });
551.       m26 =Class.forName("org.springframework.aop.framework.Advised").getMethod("getTargetClass",new Class[0]);
552.       m8 =Class.forName("org.springframework.aop.framework.Advised").getMethod("getTargetSource",new Class[0]);
553.       m22 = Class.forName("org.springframework.aop.framework.Advised").getMethod("addAdvisor",new Class[] { Integer.TYPE,Class.forName("org.springframework.aop.Advisor") });
554.       m20 =Class.forName("org.springframework.aop.framework.Advised").getMethod("isExposeProxy",new Class[0]);
555.       m21 =Class.forName("org.springframework.aop.framework.Advised").getMethod("addAdvisor",new Class[] { Class.forName("org.springframework.aop.Advisor") });
556.       m16 =Class.forName("org.springframework.aop.framework.Advised").getMethod("addAdvice",new Class[] { Integer.TYPE,Class.forName("org.aopalliance.aop.Advice") });
557.       m9 =Class.forName("org.springframework.aop.framework.Advised").getMethod("getProxiedInterfaces",new Class[0]);
558.       m23 =Class.forName("org.springframework.aop.framework.Advised").getMethod("removeAdvisor",new Class[] { Integer.TYPE });
559.       m5 =Class.forName("org.springframework.aop.framework.Advised").getMethod("indexOf",new Class[] { Class.forName("org.aopalliance.aop.Advice") });
560.       m12 = Class.forName("org.springframework.aop.framework.Advised").getMethod("setPreFiltered",new Class[] { Boolean.TYPE });
561.       m13 =Class.forName("org.springframework.aop.framework.Advised").getMethod("replaceAdvisor",new Class[] { Class.forName("org.springframework.aop.Advisor"),Class.forName("org.springframework.aop.Advisor") });
562.       m1 =Class.forName("java.lang.Object").getMethod("equals", newClass[] { Class.forName("java.lang.Object") });
563.       m18 =Class.forName("org.springframework.aop.framework.Advised").getMethod("getAdvisors",new Class[0]);
564.       m10 =Class.forName("org.springframework.aop.framework.Advised").getMethod("isInterfaceProxied",new Class[] { Class.forName("java.lang.Class") });
565.       m17 =Class.forName("org.springframework.aop.framework.Advised").getMethod("addAdvice",new Class[] { Class.forName("org.aopalliance.aop.Advice") });
566.       m3 =Class.forName("com.alipay.sofa.boot.examples.demo.rpc.bean.PersonService").getMethod("sayName",new Class[] { Class.forName("java.lang.String") });
567.       m0 = Class.forName("java.lang.Object").getMethod("hashCode",new Class[0]);
568.       m7 =Class.forName("org.springframework.aop.framework.Advised").getMethod("setTargetSource",new Class[] { Class.forName("org.springframework.aop.TargetSource")});
569.       m14 = Class.forName("org.springframework.aop.framework.Advised").getMethod("toProxyConfigString",new Class[0]);
570.       return;
571.     }
572.     catch (NoSuchMethodExceptionlocalNoSuchMethodException)
573.     {
574.       throw newNoSuchMethodError(localNoSuchMethodException.getMessage());
575.     }
576.     catch (ClassNotFoundExceptionlocalClassNotFoundException)
577.     {
578.     }
579.     throw newNoClassDefFoundError(localClassNotFoundException.getMessage());
580.   }
581. }

 1.1.2 AOP代理之CGLIB动态代理

        针对类(例如:com.alipay.sofa.boot.examples.demo.rpc.bean.PersonServiceImpl2),为其创建JVM服务的AOP代理对象的主要逻辑如下:

        1.   创建handler,此处为ServiceProxy抽象类的子类JvmServiceInvoker的实例。该类继承了ServiceProxy,而ServiceProxy实现了org.aopalliance.intercept.MethodInterceptor接口,表示此处创建AOP代理的方法拦截器。该AOP代理拦截器拦截对proxyClass指定的接口(例如: PersonService)的方法调用。

        2.   创建AOP代理工厂类org.springframework.aop.framework.ProxyFactory的实例factory;

        3.   配置factory:如果javaClass为接口,则factory的interfaces列表中增加javaClass。否则,设置factory的targetClass为javaClass,proxyTarget为true。

        4.   把指定的AOP advice实例handler增加到advice链尾部。

        5.   调用factory的getProxy方法,为指定服务创建AOP代理对象。由于此处目标类是未实现任何接口的类,则使用CGLIB动态代理技术。Spring使用CGLIB来生成代理对象,具体的实现代码放在org.springframework.aop.framework.ObjenesisCglibAopProxy这个类中。

        以上是使用CGLIB动态代理机制动态创建JVM服务的AOP代理对象的主要流程。

        为了查看CGLIB动态生成的代理对象的源文件,必须先导出字节码文件,然后通过反编译工具(如:jad)生成源文件。对于CGLIB,导出字节码文件方式为在应用代码开始位置设置DebuggingClassWriter.DEBUG_LOCATION_PROPERTY值,此值为class文件的存储目录,如:E:/proxy/cglib:

1.  @SpringBootApplication
2.  @ImportResource({"classpath*:rpc-starter-example.xml" })
3.  public class SofaBootRpcDemoApplication {
4.   
5.      publicstatic void main(String[] args) throws InterruptedException {
6.       
7.      System.setProperty(DebuggingClassWriter.DEBUG_LOCATION_PROPERTY,"E:/proxy/cglib");
8.       
9.        ConfigurableApplicationContext ac =SpringApplication.run(SofaBootRpcDemoApplication.class, args);
10.          
11.  
12.     }
13. }

        以下为PersonServiceImpl2类的AOP代理对象的源文件:

1.  packagecom.alipay.sofa.boot.examples.demo.rpc.bean;
2.   
3.  import java.lang.reflect.Method;
4.  importorg.springframework.aop.SpringProxy;
5.  importorg.springframework.aop.framework.Advised;
6.  import org.springframework.cglib.core.ReflectUtils;
7.  importorg.springframework.cglib.core.Signature;
8.  importorg.springframework.cglib.proxy.Callback;
9.  importorg.springframework.cglib.proxy.Dispatcher;
10. importorg.springframework.cglib.proxy.Factory;
11. importorg.springframework.cglib.proxy.MethodInterceptor;
12. importorg.springframework.cglib.proxy.MethodProxy;
13. importorg.springframework.cglib.proxy.NoOp;
14.  
15. public classPersonServiceImpl2$$EnhancerBySpringCGLIB$$8722cff4 extends PersonServiceImpl2
16.   implements SpringProxy, Advised, Factory
17. {
18.   private boolean CGLIB$BOUND;
19.   public static Object CGLIB$FACTORY_DATA;
20.   private static final ThreadLocalCGLIB$THREAD_CALLBACKS;
21.   private static final Callback[]CGLIB$STATIC_CALLBACKS;
22.   private MethodInterceptor CGLIB$CALLBACK_0;
23.   private MethodInterceptor CGLIB$CALLBACK_1;
24.   private NoOp CGLIB$CALLBACK_2;
25.   private Dispatcher CGLIB$CALLBACK_3;
26.   private Dispatcher CGLIB$CALLBACK_4;
27.   private MethodInterceptor CGLIB$CALLBACK_5;
28.   private MethodInterceptor CGLIB$CALLBACK_6;
29.   private static Object CGLIB$CALLBACK_FILTER;
30.   private static final MethodCGLIB$sayName$0$Method;
31.   private static final MethodProxyCGLIB$sayName$0$Proxy;
32.   private static final Object[]CGLIB$emptyArgs;
33.   private static final MethodCGLIB$equals$1$Method;
34.   private static final MethodProxyCGLIB$equals$1$Proxy;
35.   private static final MethodCGLIB$toString$2$Method;
36.   private static final MethodProxyCGLIB$toString$2$Proxy;
37.   private static final MethodCGLIB$hashCode$3$Method;
38.   private static final MethodProxyCGLIB$hashCode$3$Proxy;
39.   privatestatic final Method CGLIB$clone$4$Method;
40.   private static final MethodProxyCGLIB$clone$4$Proxy;
41.  
42.   static void CGLIB$STATICHOOK123()
43.   {
44.     CGLIB$THREAD_CALLBACKS = new ThreadLocal();
45.     CGLIB$emptyArgs = new Object[0];
46.     Class localClass1 = Class.forName("com.alipay.sofa.boot.examples.demo.rpc.bean.PersonServiceImpl2$$EnhancerBySpringCGLIB$$8722cff4");
47.     Class localClass2;
48.     Method[] tmp50_47 =ReflectUtils.findMethods(new String[] { "sayName","(Ljava/lang/String;)Ljava/lang/String;" }, (localClass2 =Class.forName("com.alipay.sofa.boot.examples.demo.rpc.bean.PersonServiceImpl2")).getDeclaredMethods());
49.     CGLIB$sayName$0$Method = tmp50_47[0];
50.     CGLIB$sayName$0$Proxy =MethodProxy.create(localClass2, localClass1, "(Ljava/lang/String;)Ljava/lang/String;","sayName", "CGLIB$sayName$0");
51.     tmp50_47;
52.     Method[] tmp131_128 =ReflectUtils.findMethods(new String[] { "equals","(Ljava/lang/Object;)Z", "toString","()Ljava/lang/String;", "hashCode", "()I", "clone","()Ljava/lang/Object;" }, (localClass2 =Class.forName("java.lang.Object")).getDeclaredMethods());
53.     CGLIB$equals$1$Method = tmp131_128[0];
54.     CGLIB$equals$1$Proxy =MethodProxy.create(localClass2, localClass1, "(Ljava/lang/Object;)Z","equals", "CGLIB$equals$1");
55.     Method[] tmp151_131 = tmp131_128;
56.     CGLIB$toString$2$Method = tmp151_131[1];
57.     CGLIB$toString$2$Proxy =MethodProxy.create(localClass2, localClass1, "()Ljava/lang/String;","toString", "CGLIB$toString$2");
58.     Method[] tmp171_151 = tmp151_131;
59.     CGLIB$hashCode$3$Method = tmp171_151[2];
60.     CGLIB$hashCode$3$Proxy =MethodProxy.create(localClass2, localClass1, "()I","hashCode", "CGLIB$hashCode$3");
61.     Method[] tmp191_171 = tmp171_151;
62.     CGLIB$clone$4$Method = tmp191_171[3];
63.     CGLIB$clone$4$Proxy = MethodProxy.create(localClass2,localClass1, "()Ljava/lang/Object;", "clone","CGLIB$clone$4");
64.     tmp191_171;
65.   }
66.  
67.   finalString CGLIB$sayName$0(String paramString)
68.   {
69.     return super.sayName(paramString);
70.   }
71.  
72.   //ERROR //
73.   public final String sayName(StringparamString)
74.   {   
75.  
76.   }
77.  
78.   final boolean CGLIB$equals$1(ObjectparamObject)
79.   {
80.     return super.equals(paramObject);
81.   }
82.  
83.   //ERROR //
84.   public final boolean equals(ObjectparamObject)
85.   {   
86.  
87.   }
88.  
89.   final String CGLIB$toString$2()
90.   {
91.     return super.toString();
92.   }
93.  
94.   //ERROR //
95.   public final String toString()
96.   { 
97.  
98.   }
99.  
100.   final int CGLIB$hashCode$3()
101.   {
102.     return super.hashCode();
103.   }
104.  
105.   //ERROR //
106.   public final int hashCode()
107.   {   
108.  
109.   }
110.  
111.   final Object CGLIB$clone$4()
112.     throws CloneNotSupportedException
113.   {
114.     return super.clone();
115.   }
116.  
117.   //ERROR //
118.   protected final Object clone()
119.     throws CloneNotSupportedException
120.   {   
121.  
122.   }
123.  
124.   public static MethodProxyCGLIB$findMethodProxy(Signature paramSignature)
125.   {
126.     String tmp4_1 = paramSignature.toString();
127.     switch (tmp4_1.hashCode())
128.     {
129.     case -2050040553:
130.       if(tmp4_1.equals("sayName(Ljava/lang/String;)Ljava/lang/String;"))
131.         return CGLIB$sayName$0$Proxy;
132.     case -508378822:
133.     case 1826985398:
134.     case 1913648695:
135.     case 1984935277:
136.     }
137.   }
138.  
139.   //ERROR //
140.   public final intindexOf(org.springframework.aop.Advisor paramAdvisor)
141.   {  
142.  
143.   }
144.  
145.   //ERROR //
146.   public final intindexOf(org.aopalliance.aop.Advice paramAdvice)
147.   {   
148.  
149.   }
150.  
151.   //ERROR //
152.   public final boolean isFrozen()
153.   {
154.     
155.   }
156.  
157.   //ERROR //
158.   public final voidaddAdvice(org.aopalliance.aop.Advice paramAdvice)
159.     throwsorg.springframework.aop.framework.AopConfigException
160.   {
161.     
162.   }
163.  
164.   //ERROR //
165.   public final void addAdvice(int paramInt, org.aopalliance.aop.AdviceparamAdvice)
166.     throwsorg.springframework.aop.framework.AopConfigException
167.   {
168.     
169.   }
170.  
171.   //ERROR //
172.   public finalorg.springframework.aop.Advisor[] getAdvisors()
173.   {
174.     
175.   }
176.  
177.   //ERROR //
178.   public final void setTargetSource(org.springframework.aop.TargetSourceparamTargetSource)
179.   {
180.     
181.   }
182.  
183.   //ERROR //
184.   public final boolean isPreFiltered()
185.   {
186.     
187.   }
188.  
189.   //ERROR //
190.   public final boolean isExposeProxy()
191.   {
192.     
193.   }
194.  
195.   //ERROR //
196.   public final void addAdvisor(int paramInt,org.springframework.aop.Advisor paramAdvisor)
197.     throwsorg.springframework.aop.framework.AopConfigException
198.   {
199.   }
200.  
201.   //ERROR //
202.   public final voidaddAdvisor(org.springframework.aop.Advisor paramAdvisor)
203.     throws org.springframework.aop.framework.AopConfigException
204.   {
205.    
206.   }
207.  
208.   //ERROR //
209.   public final booleanremoveAdvisor(org.springframework.aop.Advisor paramAdvisor)
210.   {
211.     
212.   }
213.  
214.   //ERROR //
215.   public final void removeAdvisor(int paramInt)
216.     throws org.springframework.aop.framework.AopConfigException
217.   {
218.     
219.   }
220.  
221.   //ERROR //
222.   public final booleanremoveAdvice(org.aopalliance.aop.Advice paramAdvice)
223.   {
224.     
225.   }
226.  
227.   //ERROR //
228.   public finalorg.springframework.aop.TargetSource getTargetSource()
229.   {
230.     
231.   }
232.  
233.   //ERROR //
234.   publicfinal Class[] getProxiedInterfaces()
235.   {
236.    
237.   }
238.  
239.   //ERROR //
240.   public final boolean isInterfaceProxied(ClassparamClass)
241.   {
242.     
243.   }
244.  
245.   //ERROR //
246.   public final void setExposeProxy(booleanparamBoolean)
247.   {
248.     
249.   }
250.  
251.   //ERROR //
252.   public final void setPreFiltered(booleanparamBoolean)
253.   {
254.     
255.   }
256.  
257.   //ERROR //
258.   public final booleanreplaceAdvisor(org.springframework.aop.Advisor paramAdvisor1,org.springframework.aop.Advisor paramAdvisor2)
259.     throwsorg.springframework.aop.framework.AopConfigException
260.   {
261.     
262.   }
263.  
264.   //ERROR //
265.   public final String toProxyConfigString()
266.   {
267.     
268.   }
269.  
270.   //ERROR //
271.   public final boolean isProxyTargetClass()
272.   {
273.     
274.   }
275.  
276.   //ERROR //
277.   public final Class getTargetClass()
278.   {
279.     
280.   }
281.  
282.   public static void CGLIB$SET_THREAD_CALLBACKS(Callback[]paramArrayOfCallback)
283.   {
284.     CGLIB$THREAD_CALLBACKS.set(paramArrayOfCallback);
285.   }
286.  
287.   public static voidCGLIB$SET_STATIC_CALLBACKS(Callback[] paramArrayOfCallback)
288.   {
289.     CGLIB$STATIC_CALLBACKS =paramArrayOfCallback;
290.   }
291.  
292.   private static final voidCGLIB$BIND_CALLBACKS(Object paramObject)
293.   {
294.     
295.   }
296.  
297.   //ERROR //
298.   public Object newInstance(Callback[]paramArrayOfCallback)
299.   {
300.     
301.   }
302.  
303.   //ERROR //
304.   public Object newInstance(CallbackparamCallback)
305.   {
306.     
307.   }
308.  
309.   //ERROR //
310.   public Object newInstance(Class[]paramArrayOfClass, Object[] paramArrayOfObject, Callback[]paramArrayOfCallback)
311.   {
312.     
313.   }
314.  
315.   //ERROR //
316.   public Callback getCallback(int paramInt)
317.   {
318.     
319.   }
320.  
321.   //ERROR //
322.   public Callback[] getCallbacks()
323.   {
324.     
325.   }
326.  
327.   //ERROR //
328.   public void setCallbacks(Callback[]paramArrayOfCallback)
329.   {
330.     
331.   }
332.  
333.   static
334.   {
335.     CGLIB$STATICHOOK124();
336.     CGLIB$STATICHOOK123();
337.   }
338.  
339.   //ERROR //
340.   static void CGLIB$STATICHOOK124()
341.   {
342.    
343.   }
344. }

 

常用的串口通信工具MobaXterm、Bus Hound、SScom等 本文介绍了四种PC端串口通信工具的功能和使用方法:MobaXterm支持SSH、FTP、串口等多种协议;Bus Hound用于监控CAN和串口数据;SScom专为串口和网口通信设计;ScriptCommunicator可进行串口通信并绘制波形图。每种工具都有详细的操作步骤图示,包括参数设置、数据监控等关键功能,并提供了官方和个人下载地址。这些工具各有特点,适用于不同的串口通信和数据分析场景。 阅读详情

相关推荐

【QMIX】一种基于Value-Based多智能体算法

文章目录1. QMIX 解决了什么问题(Motivation)2. QMIX 怎样解决团队收益最大化问题(Method)2.1 算法大框架 —— 基于 AC 框架的 CTDE(Centralized Training Distributed Execution) 模式 QMIX 是一种基于 Value-Based 的多智能体强化学习算法(MARL),其基本思想来源于 Actor-Critic 与 DQN 的结合。使用中心式学习(Centralized Learning)分布式执行(Distributed

qq_38638132的博客 9860

SOFABoot源码解析之JVM服务

1.SOFABoot源码解析1.1  JVM服务1.1.1 服务发布        以SOFABoot自带的RPC案例sofaboot-sample-with-rpc为例,详细描述SOFABoot JVM服务发布过程。        在此提前说明,源码分析主要分析主流程,以及本人认为比较重要的一些内容,对于其它部分,大家可以基于本文档,自行研读。        RPC案例的SpringXML配置文...

闲来无事 3904

审稿人看了直呼内行:多组学整合分析——科研小白进阶之路

多组学,多平台分析解决方案

pysonger的博客 3944

SOFABoot扩展@sofaservice

项目需要,使用了SOFABoot,它是蚂蚁金服开源的基于 Spring Boot (当然它是建立在spring 之上)的研发框架,使用过程中,发现很多个服务注册时有些慢,特别是测试时,其实我只想测试一两个服务,那么程序启动时我根本就不需要注册那么多服务,测试时按需注册、个性化,钉钉上问了相关工作人员,他们说没有,我只能自己实现了。 1. 首先去github上把源码下载下来,地址:https://github.com/sofastack/sofa-boot 导入到开发工具,看个人情况是eclipse...

董广明的博客 3480

LTX-2.3 V1.6:8G显存本地AI视频生成工具与int8量化加速实践

这次我们来看一个本地部署的AI视频生成工具——LTX-2.3文字图片生成带音频视频工具V1.6版本。这个工具最大的特点是支持int8量化加速,相比原版提速2-4倍,效果更好,而且8G显存就能运行,不需要搭建复杂环境,解压即可使用。 对于想要在本地电脑上快速生成带音频视频内容的用户来说,这个工具解决了几个关键痛点:首先是硬件门槛低,8G显存意味着大多数主流游戏显卡都能胜任;其次是部署简单,避免了Python环境配置、依赖包冲突等常见问题;最后是性能优化明显,int8加速让生成速度大幅提升。 本文会重点演示如何

hqmln的博客 1235

【新手必看】蓝牙的HOGP和HID、GATT有什么区别和联系

让新手宏观了解蓝牙HOGP、HID、GATT这三个协议的区别和联系

qq_51976334的博客 1565

SOFABoot源码解析之Readiness检查

        SOFABoot在SpringBoot的Liveness检查能力的基础上,增加了Readiness检查能力。如果你需要使用SOFA中间件,那么建议使用SOFABoot的Readiness检查能力,来更优雅的上线应用实例。一、SpringBoot健康检查        SpringBootActuator帮助我们监控我们的SpringBoot项目。        SpringBoot...

闲来无事 5345

【CSP-J/S】复赛注意事项 上机文件组织形式

每年/S 复赛都有很多同学因为一些小失误导致一年的努力付之东流。Tony老师整理了一些复赛容易踩坑的点,或许对你有帮助!

星卯教育-信奥教练tony 1万+

Spring-boot 集成sofa 加入 aop切面编程

Spring-boot 集成sofa 加入 aop切面编程 AOP的核心概念: 1、横切关注点 对哪些方法进行拦截,拦截后怎么处理,这些关注点称之为横切关注点 2、切面(aspect) 类是对物体特征的抽象,切面就是对横切关注点的抽象 3、连接点(join point) 被拦截到的点,因为Spring只支持方法类型的连接点,所以在Spring中连接点指的就是被拦截到的方法,实际上连接点还可以是...

kevin2562的专栏 888

使用PostgreSQL构建高可用数据库集群

在现代企业级应用中,数据库的高可用性已成为业务连续性的核心要求。PostgreSQL作为一款功能强大的开源关系型数据库,其高可用架构的设计直接影响着系统的稳定性和可靠性。

九天的专栏 1259

R3LIVE项目实战(3) —双目相机与激光雷达 lidar_camera_calib联合标定

lidar_camera_calib是一个在无目标环境中,用于高分辨率LiDAR(例如Livox)和摄像机之间准确的外部标定工具。我们的算法可以在室内和室外场景中运行,并且只需要场景中的边缘信息。如果场景适合,我们可以实现类似于或甚至超过基于目标的方法的像素级准确度。我们使用标定的外部参数给点云上色,并与实际图像进行比较。A和C是点云的局部放大视图。B和D是与A和C中的点云对应的摄像机图像的部分。

几度春风里的博客 4057

【剖析|SOFARPC 框架】系列之 SOFARPC 注解支持剖析

1、前言 在 SOFABoot 环境下,SOFARPC 提供三种方式给开发人员发布和引用 RPC 服务: XML 方式(配置) Annotation 方式(注解) 编程 API 方式(动态) 编程 API 方式与Spring 的 ApplicationContextAware 类似。XML的方式依赖于在xml中引入 SOFA 命名空间,利用 Bean...

weixin_34186950的博客 879

【TCAD】Sentaurus 中的“陷阱trap”仿真设置

允许使用有限的数据集名称 SFactor 规范,例如 DeepLevels , xMoleFraction , 和 yMoleFraction (从兴奋剂档案中读取) eTrappedCharge 和 hTrappedCharge (从指定的文件中读取 DevFields 在 File 部分)或 PMI 用户字段 PMIUserField0...10 (从指定的文件中读取 PMIUserFields 在 File 部分)。给定的陷阱截面 eNeutral 陷阱是多种多样的 Xsec 项目参数。

荷塘阅色 1308

SOFABoot源码解析之模块化开发

1.SOFABoot源码解析1.1  模块化开发1.1.1 简述        关于SOFABoot模块化开发的文档来自于Alipay开源社区Wiki,链接地址为:        https://github.com/alipay/sofa-boot/wiki/Modular-Development        此处直接引用该文档内容,主要是便于大家理解源码解析部分。1.1.1.1  模块化开发...

闲来无事 3558

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

SOFA RPC源码解析之Rest服务(1)-服务发布

1.SOFA RPC源码解析1.1  Rest服务1.1.1 服务发布        以SOFABoot自带的RPC案例sofaboot-sample-with-rpc为例,详细描述SOFABoot Rest服务发布原理。        在此提前说明,源码分析主要分析主流程,以及本人认为比较重要的一些内容,对于其它部分,大家可以基于本文档,自行研读。        RPC案例的SpringXML配...

闲来无事 3607

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

SOFA RPC源码解析之Rest服务(2)-服务引用

1.SOFA RPC源码解析1.1Rest服务1.1.1 服务引用        以SOFABoot自带的RPC案例sofaboot-sample-with-rpc为例,详细描述SOFABoot服务发布原理。        在此提前说明,源码分析主要分析主流程,以及本人认为比较重要的一些内容,对于其它部分,大家可以基于本文档,自行研读。        RPC案例的SpringXML配置文件内容如下...

闲来无事 1442

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

最新阿里巴巴关于Java重要开源项目汇总,程序员真的是吃青春饭吗

这份面试题几乎包含了他在一年内遇到的所有面试题以及答案,甚至包括面试中的细节对话以及语录,可谓是细节到极致,甚至简历优化和怎么投简历更容易得到面试机会也包括在内!也包括教你怎么去获得一些大厂,比如阿里,腾讯的内推名额!某位名人说过成功是靠99%的汗水和1%的机遇得到的,而你想获得那1%的机遇你首先就得付出99%的汗水!你只有朝着你的目标一步一步坚持不懈的走下去你才能有机会获得成功!成功只会留给那些有准备的人!

2401_84585372的博客 682

阿里巴巴开源的 26 种项目介绍及源码分享,强烈推荐!

1.分布式应用服务开发的一站式解决方案 Spring Cloud AlibabaSpring Cloud Alibaba 致力于提供分布式应用服务开发的一站式解决方案。此项目包含开发分布...

Java精选 2304

蚂蚁金服开源增强版 Spring Boot 的研发框架!

针对 Spring Boot 缺少 Readiness Check 能力的情况,SOFABoot 增加了 Spring Boot 现有的健康检查的能力,提供了 Readiness Check 的能力。利用 Readiness Check 的能力,SOFA 中间件中的各个组件只有在 Readiness Check 通过之后,才将流量引入到应用的实例中,比如 RPC,只有在 Readiness Check 通过之后,才会向服务注册中心注册,后面来自上游应用的流量才会进入。提供类隔离的能力========

2401_84046677的博客 640

java jxl包_阿里26款Java开源项目(附源码),看完收藏!

1.分布式应用服务开发的一站式解决方案 Spring Cloud AlibabaSpring Cloud Alibaba 致力于提供分布式应用服务开发的一站式解决方案。此项目包含开发分布式应用服务的必需组件,方便开发者通过 Spring Cloud 编程模型轻松使用这些组件来开发分布式应用服务。依托 Spring Cloud Alibaba,您只需要添加一些注解和少量配置,就可以将 Spring ...

weixin_39688035的博客 121

阿里巴巴的26款超神Java开源项目!

1.分布式应用服务开发的一站式解决方案 Spring Cloud Alibaba Spring Cloud Alibaba 致力于提供分布式应用服务开发的一站式解决方案。此项目包含开发分布式应用服务的必需组件,方便开发者通过 Spring Cloud 编程模型轻松使用这些组件来开发分布式应用服务。 依托 Spring Cloud Alibaba,您只需要添加一些注解和少量配置,就可以将 Spring Cloud 应用接入阿里分布式应用解决方案,通过阿里中间件来迅速搭建分布式应用系统。 地址:https

435

蚂蚁课堂-第四期-基于springcloud构建微服务电商项目_阿里巴巴29个屌炸天的开源项目,你用过几个?附编程资料!!!...

1. 分布式应用服务开发的一站式解决方案 Spring Cloud AlibabaSpring Cloud Alibaba 致力于提供分布式应用服务开发的一站式解决方案。此项目包含开发分布式应用服务的必需组件,方便开发者通过 Spring Cloud 编程模型轻松使用这些组件来开发分布式应用服务。依托 Spring Cloud Alibaba,您只需要添加一些注解和少量配置,就可以将 Spring...

weixin_39733812的博客 127

2024年Java最全阿里巴巴的26款超神Java开源项目,2024Java大厂面试经验

面试前一定少不了刷题,为了方便大家复习,我分享一波个人整理的面试大全宝典Java核心知识整理Java核心知识Spring全家桶(实战系列)其他电子书资料Step3:刷题既然是要面试,那么就少不了刷题,实际上春节回家后,哪儿也去不了,我自己是刷了不少面试题的,所以在面试过程中才能够做到心中有数,基本上会清楚面试过程中会问到哪些知识点,高频题又有哪些,所以刷题是面试前期准备过程中非常重要的一点。以下是我私藏的面试题库:本文已被。

2301_82257317的博客 2161

阿里有趣的Java开源项目

今天分享一篇阿里云社区的文章,把阿里开源的 Java 项目进行了整理,一篇值得收藏的文章,这些开源项目值得各位花时间去好好研究,一定要挑几个感兴趣的项目,读读源码。   原文如下。     1、Spring Cloud Alibaba   Spring Cloud Alibaba 致力于提供分布式应用服务开发的一站式解决方案。此项目包含开发分布式应用服务的必需组件,方便开发者通过 S...

KHOST的博客 1355

26 款阿里超神 Java 开源项目,看看你用过几个?

点击上方“芋道源码”,选择“设为星标”做积极的人,而不是积极废人!源码精品专栏中文详细注释的开源项目RPC 框架 Dubbo 源码解析网络应用框架 Netty 源码解析消息中间件 Ro...

芋艿V 314

阿里巴巴的26款超神Java开源项目

目录 1.分布式应用服务开发的一站式解决方案 Spring Cloud Alibaba 2. JDBC 连接池、监控组件 Druid 3. Java 的 JSON 处理器 fastjson 4. 服务框架 Dubbo 5. 企业级流式计算引擎 JStorm 6. a...

weixin_30258901的博客 227
上一篇: SOFA RPC源码解析之RPC代理机制
下一篇: SOFA RPC源码解析之Rest服务(1)-服务发布
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

任性之闲来无事

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值