序言:我想创建一个现有代理的代理(在春季使用cglib软件包) ,例如当我调用原始方法类时,两个代理的两个方法都首先被调用。有什么意义吗?或者有可能吗?
问题:创建第二个enhancer
时,我得到了
java.lang.ClassFormatError-->Duplicate method name "newInstance" with signature "
例外。
示例代码如下
原始班级
public class OriginalClass {
public void print(){
System.out.println("MAIN METHOD");
}
}
创建两个代理
public class Main {
public static void main(String[] args) {
//Create First Proxy
Enhancer firstEnhancer= new Enhancer();
firstEnhancer.setSuperclass(OriginalClass.class);
firstEnhancer.setCallback((MethodInterceptor) (o,method,objects,methodProxy) -> {
System.out.println("METHOD INTERCEPTOR AT FIRST Proxy");
return methodProxy.invokeSuper(o,objects);
});
OriginalClass firstProxy = (OriginalClass) firstEnhancer.create();
//Create Second Proxy
Enhancer secondEnhancer= new Enhancer();
secondEnhancer.setSuperclass(firstProxy.getclass());
secondEnhancer.setCallback((MethodInterceptor) (o,methodProxy) -> {
System.out.println("METHOD INTERCEPTOR AT SECOND Proxy");
return methodProxy.invokeSuper(o,objects);
});
//Getting Exception on this line
OriginalClass secondProxy = (OriginalClass) secondEnhancer.create();
//Call
secondProxy.print();
}
}
预期结果如下(打印)
METHOD INTERCEPTOR AT SECOND Proxy
METHOD INTERCEPTOR AT FIRST Proxy
MAIN METHOD
但是我收到以下异常(在创建第二个代理时)
Caused by: java.lang.ClassFormatError: Duplicate method name "newInstance" with signature "([Lorg.springframework.cglib.proxy.Callback;)Ljava.lang.Object;" in class file com/test/OriginalClass$$EnhancerByCGLIB$$37b306ed$$EnhancerByCGLIB$$15133919
现实世界场景
我想使用BeanPostProcessors
和cglib
在到Spring代理的所有bean上包装一个代理。例如,我想在所有@transactional
方法上包装一个代理(在事务前后记录日志)。
更新:我更喜欢创建代理,而不是AOP。(AOP本身是代理)