jdk 以及CGlib代理

public class MyProxyUtils {

	/**
	 * 使用JDK的动态代理实现 它是基于接口实现的
	 * 
	 * @param serviceImpl
	 * @return
	 */
	public static UserService getProxy(UserService service) {

		// Proxy是JDK中的API类
		// 第一个参数:目标对象的类加载器
		// 第二个参数:目标对象的接口
		// 第二个参数:代理对象的执行处理器
		UserService userService = (UserService) Proxy.newProxyInstance(service.getClass().getClassLoader(),
				service.getClass().getInterfaces(), new InvocationHandler() {

					@Override
					public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

						System.out.println("记录日志-开始");

						// 下面的代码,是反射中的API用法
						// 该行代码,实际调用的是目标对象的方法
						Object object = method.invoke(service, args);

						System.out.println("记录日志-结束");
						return object;
					}
				});

		return userService;
	}

	/**
	 * 使用CGLib动态代理技术实现 它是基于继承的方式实现的
	 * 
	 * @param service
	 * @return
	 */
	public static UserService getProxyByCgLib(UserService service) {

		// 创建增强器
		Enhancer enhancer = new Enhancer();
		// 设置需要增强的类的类对象
		enhancer.setSuperclass(UserServiceImpl.class);

		// 设置回调函数
		enhancer.setCallback(new MethodInterceptor() {

			// MethodProxy:代理之后的对象的方法引用
			@Override
			public Object intercept(Object object, Method method, Object[] arg, MethodProxy methodProxy)
					throws Throwable {

				long start = System.currentTimeMillis();
				System.out.println("记录程序开始时间..." + start);

				// 因为代理对象是目标对象的子类
				// 该行代码,实际调用的是目标对象的方法
				// object :代理对象
				Object object2 = methodProxy.invokeSuper(object, arg);

				long end = System.currentTimeMillis();
				System.out.println("记录程序结束时间..." + end);
				System.out.println("记录程序执行总时长..." + (end - start));
				return object2;
			}
		});

		// 获取增强之后的代理对象
		UserService userService = (UserService) enhancer.create();
		return userService;
	}
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值