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

当图像配准遇见边缘计算:低功耗设备的优化实践 本文探讨了在边缘计算环境下优化图像配准技术的实践方法,重点解决低功耗设备如树莓派和Jetson Nano上的算力瓶颈问题。通过算法轻量化、硬件加速和内存优化等策略,实现了毫秒级图像配准,适用于智能安防、移动医疗等实时性要求高的场景。 阅读详情

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. }

 

解释多智能体强化学习(Multi-Agent Reinforcement Learning)(面试题200合集,中频、重要) 多智能体强化学习通过扩展传统强化学习框架,研究多个智能体在动态、交互环境中的策略优化问题。它既有理论上的挑战(如非平稳性和均衡求解),也有广泛的实际应用前景。数学上,它依赖马尔可夫博弈模型,核心是设计算法让智能体在合作或竞争中达到最优。 阅读详情

相关推荐

手把手教你调试RTL8201F:从芯片手册解读到LWIP驱动移植

本文详细解析了RTL8201F PHY芯片的开发流程,从寄存器配置到LWIP驱动移植,重点介绍了RMII模式下的特殊配置要点和调试技巧。通过实战案例和高级调试方法,帮助工程师解决网络性能问题,实现与FreeRTOS+LWIP协议栈的稳定集成。

ik678901234的博客 972

SOFABoot源码解析之JVM服务

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

闲来无事 3904

WinDbg调试工具安装全攻略:从下载到配置的保姆级教程(Windows 10/11适用)

本文提供了一份详细的WinDbg调试工具安装与配置指南,适用于Windows 10/11用户。文章对比了WinDbg Preview独立版与SDK内置经典版的区别,并手把手指导从Microsoft Store或Windows SDK完成安装。核心部分重点讲解了如何配置符号文件路径与源代码路径,这是让WinDbg发挥强大调试功能的关键步骤,并针对常见安装问题提供了实用的排错方法。

hp777的博客 386

SOFABoot扩展@sofaservice

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

董广明的博客 3480

从DIY桌面CNC到工业机器人:手把手教你用LinuxCNC搭建自己的第一台数控系统(基于Xenomai实时补丁)

本文详细介绍了如何使用LinuxCNC和Xenomai实时补丁搭建高性价比的数控系统,从硬件选型到实时系统构建,再到HAL硬件抽象层实战和G代码加工,手把手教你打造从DIY桌面CNC到工业机器人的完整解决方案。

weixin_28727975的博客 288

制造业批次管理中双计量单位动态转换的实践指南

本文详细介绍了制造业批次管理中双计量单位动态转换的实践指南,特别是在SAP系统中的配置与操作步骤。通过实际案例展示了如何解决采购与生产部门计量单位不一致的问题,提升物料管理效率。重点讲解了批次特性配置、移动类型调整及常见问题排查方法,适用于金属加工、化工等多个行业。

weixin_29228203的博客 159

SOFABoot源码解析之Readiness检查

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

闲来无事 5345

ArcGIS基础实战:面数据拓扑创建和错误修改全流程

通过下图的操作我们可以发现,图层的【Shape_Length】和【Shape_Area】字段的数值都发生了改变,表明两个图层重叠的那一部分图斑合并到另一个图班上,其面积会减小、长度会变大(自己重新计算一下也可以得到此验证结果的)。如图【拓扑实验结果】文件夹里右键,新建【文件地理数据库】,并进行命名为【xx拓扑检查】备注:养成良好的命名习惯。然后在【xx拓扑检查】下右键打开【新建要素数据集】,并对数据集进行命名为【XX拓扑】,然后进行下一步设置。在【KK拓扑】数据集上右键,新建【拓扑】。

yuanYW7556的博客 1万+

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

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

kevin2562的专栏 888

【STM32 CubeMX】I2C中断方式与DMA方式

在STM32 CubeMX环境中,I2C(Inter-Integrated Circuit)通信协议的实现可以采用中断方式或DMA(Direct Memory Access)方式。中断方式通过触发中断来处理数据传输,而DMA方式则利用直接内存访问技术来实现数据传输,减轻了CPU的负担。在选择I2C通信方式时,开发者需要根据具体的应用需求和性能要求来选择合适的方式。STM32 CubeMX提供了图形化配置工具,使得配置I2C通信方式变得更加便捷。

m0_62599305的博客 7747

【AI大模型应用开发】【RAG评估】0. 综述:一文了解RAG评估方法、工具与指标

本文主要总结了当前比较流行的RAG评估方法和指标。当前AI技术的快速发展,RAG和RAG评估是当前比较有前景的发展方向,不断有新的评估工具和理论被提出,让我们持续跟进,了解这些工具和理论,从而在使用时知道如何选择。

同学小张的博客 6828

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

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

weixin_34186950的博客 879

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

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

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

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

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

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

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

闲来无事 3607

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

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

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

闲来无事 1442

最新阿里巴巴关于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

SpringFramework之ProxyFactory

Spring版本是5.0.4.release. ProxyFactory在Springaop中占有举足轻重的地位,用来间接创建代理,如下List-1所示,我们给ServiceImpl创建代理。 List-1 public interface IService { ...

choubayan4320的博客 317
上一篇: 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、付费专栏及课程。

余额充值