jdk 动态代理的创建速度比cglib的动态代理创建速度要快8倍左右,但cglib的动态代理性能要比jdk动态代理快10倍以上,所以一般sington bean 用cglib动态代理比较好,而prototype bean 用jdk动态代理会较好
jdk动态代理类:
package com.sharp.cxf.service; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; /** * 类 名 称: MyInvocationHandler * 类 描 述: * 创 建 人: peng.xiao * 创建时间: 2013-7-23 下午9:32:45 * * 修 改 人: peng.xiao * 操作时间: 2013-7-23 下午9:32:45 * 操作原因: * */ public class MyInvocationHandler implements InvocationHandler { private Object obj; public MyInvocationHandler(Object obj) { super(); this.obj = obj; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("++++++++++"); return method.invoke(obj, args); } }
cglib动态代理类:
package com.sharp.cxf.service; import java.lang.reflect.Method; import net.sf.cglib.proxy.Enhancer; import net.sf.cglib.proxy.MethodInterceptor; import net.sf.cglib.proxy.MethodProxy; public class MyMethodIntercetpor implements MethodInterceptor { private Enhancer enhancer = new Enhancer(); @SuppressWarnings("unchecked") public <T> T getProxy(Class<T> cls){ enhancer.setSuperclass(cls); enhancer.setCallback(this); return (T)enhancer.create(); } @Override public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable { System.out.println("+++++++++++++++++"); return proxy.invokeSuper(obj, args); } }
main方法:
package com.sharp.cxf.service; import java.lang.reflect.Proxy; import com.sharp.cxf.service.impl.UserServiceImpl; public class Main { public static void main(String[] args) { IUserService userService = new UserServiceImpl(); /** * java 动态代理 */ /*MyInvocationHandler hander = new MyInvocationHandler(userService); IUserService proxy = (IUserService)Proxy.newProxyInstance(userService.getClass().getClassLoader(), userService.getClass().getInterfaces(), hander);*/ /** * cglib 代理 */ MyMethodIntercetpor methodIntercetpor = new MyMethodIntercetpor(); IUserService proxy = methodIntercetpor.getProxy(UserServiceImpl.class); System.out.println(proxy.sayHi()); } }