1、概述:
常用Cglib代理但没详细研究过MethodInterceptor里method与MethodProxy对象,这两对象都可以调用自身方法那到底谁更快些以及使用区别?
public Object buildProxy(Object target) {
Class<?> proxyClass = object.getClass();
if (proxyClass == null) {
Enhancer enhancer = new Enhancer();
if (targetClass.isInterface()) {
enhancer.setInterfaces(new Class[] { targetClass });
} else {
enhancer.setSuperclass(targetClass);
}
enhancer.setCallbackType(AsyncMethodInterceptor.class);
proxyClass = enhancer.createClass();
logger.debug("create proxy class:{}",targetClass);
}
Enhancer.registerCallbacks(proxyClass,new Callback[]{new AsyncMethodInterceptor(target)});
Object proxyObject = null;
try{
proxyObject = ReflectionHelper.newInstance(proxyClass);
}finally{
Enhancer.registerStaticCallbacks(proxyClass, null);
}
return proxyObject;
}
public class AsyncMethodInterceptor implements MethodInterceptor {
private Object targetObject;
public AsyncMethodInterceptor(Object targetObject) {
this.targetObject = targetObject;
}
@Override
public Object intercept(Object target, Method method, Object[] args, MethodProxy
methodProxy) throws Throwable {
// return method.invoke(targetObject,args); //方法一
return methodProxy.invokeSuper(target, args); //方法二
}
}
二、两者区别讲解
例如:
@Service
public class UserService implements IUserService{
private final static Logger logger = LoggerFactory.getLogger(UserService.class);
@Async
public User test2(User user,long sellpTime){
logger.debug("测试1正在访问UserService.editUser");
return user;
}
@Async
public AsyncResult<User> test1(int a){
User u = test2();
return new AsyncResult<User>().setData(u);
}
}
在用Cglib代理这个UserService过程中发现,如果是使用method.invoke则当在调用test1方法中调用test2是不会被MethodIntercepter拦截的;如果使用MethodProxy.invokeSuper则在调用test1方法中调用test2是会被MethodIntercepter拦截;
附性能测试结果: