文档章节

cglib动态代理

cwsone
 cwsone
发布于 2012/06/04 13:03
字数 467
阅读 249
收藏 1

Spring AOP使用了两种代理机制,一种是基于JDK的动态代理,另一种是基于CGLib的动态代理,

之所以需要两种代理机制,很大程度上是因为JDK本身只提供基于接口的代理,不支持类的代理。

切入点一般是方法调用之前,之后或者两端。

1、要代理的类

package com.yt.manager.proxy;

public class ServicesImpl {

	public void outPut() {
		// TODO Auto-generated method stub
		System.out.println("to run outPut method..............");
	}

	public void putOut() {
		// TODO Auto-generated method stub
		System.out.println("to run putOut method..............");
	}

	public void outPut1(String v) {
		System.out.println("参数内容:" + v);
	}

}

2、cglib代理类

package com.yt.manager.proxy;

import java.lang.reflect.Method;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

/**
 * cglib动态代理 intercept(Object obj, Method method, Object[] args,MethodProxy
 * proxy) 是CGLib定义的Inerceptor接口的方法,obj表示代理后的子类 , method为父类方法的反射对象,args为方法的动态入参,
 * 而proxy为代理类实例。一般使用 proxy进行调用父类方法,这样更快。
 * @author zxf
 * 
 */
public class CGlibProxyFactory implements MethodInterceptor {

	private Enhancer enhancer = new Enhancer();

	public Object getProxy(Class c) {
		enhancer.setSuperclass(c); // ① 设置需要创建子类的类
		enhancer.setCallback(this);
		return enhancer.create(); // ②通过字节码技术动态创建子类实例
	}

	@Override
	public Object intercept(Object arg0, Method arg1, Object[] arg2,
			MethodProxy arg3) throws Throwable {
		before();
		arg3.invokeSuper(arg0, arg2);
		end();
		return null;
	}

	public void before() {
		System.out.println("--------在调用要代理类的方法前做的处理----------");
	}

	public void end() {
		System.out.println("--------在调用要代理类的方法后做的处理----------");
	}

}

3、测试调用

package com.yt.manager.proxy;

/**
 * 调用代理测试类
 * @Description: 
 * @ClassName: TestProxy
 * @Project: base-info
 * @Author: zxf
 * @Date: 2011-5-19
 */
public class TestProxy {

	public static void main(String[] args) {
		//cjlib基于类的代理
		ServicesImpl serviceImp = (ServicesImpl) new CGlibProxyFactory().getProxy(ServicesImpl.class);
		serviceImp.outPut();

	}
}

intercept(Object obj, Method method, Object[] args,MethodProxy proxy)是CGLib定义的Inerceptor接口的方法,obj表示代理后的子类 ,method为父类方法的反射对象,args为方法的动态入参, 而proxy为代理类实例。一般使用 proxy进行调用父类方法,这样更快。

© 著作权归作者所有

共有 人打赏支持
上一篇: Log4j配置项目
下一篇: Spring的体系结构
cwsone
粉丝 19
博文 13
码字总数 7583
作品 0
北京
后端工程师
私信 提问
深入理解Cglib动态代理及手动实现

CGLIB介绍与原理(部分节选自网络) 一、什么是CGLIB? CGLIB是一个功能强大,高性能的代码生成包。它为没有实现接口的类提供代理,为JDK的动态代理提供了很好的补充。通常可以使用Java的动态代...

HOT_POT
2018/07/28
0
0
动态代理:JDK动态代理和CGLIB代理的区别

本文转载自:动态代理:JDK动态代理和CGLIB代理的区别 代理模式:代理类和被代理类实现共同的接口(或继承),代理类中存有指向被代理类的索引,实际执行时通过调用代理类的方法、实际执行的是...

淡淡的倔强
2018/09/07
0
0
Spring Proxy 动态代理(ProxyFactory)

一、动态代理生成技术栈分为两种: 1、JDK动态代理 JDK动态代理只能对实现了接口的类生成代理,而不能针对类 2、Cglib动态代理 CGLIB是针对类实现代理,主要是对指定的类生成一个子类,覆盖其...

王微_1986
2018/07/27
0
0
Spring中JDK动态代理和Cglib代理的区别

Spring的AOP基于代理模式,并且它即使用到了JDK动态代理也使用了Cglib代理。 如下代码是springAOP中默认的代理实现类DefaultAopProxyFactory,其中创建代理的方法createAopProxy,在这个方法...

王子城
2018/08/01
0
0
spring基础知识---AOP动态代理原理

Spring Boot实践——Spring AOP实现之动态代理 Spring AOP 介绍   AOP的介绍可以查看 Spring Boot实践——AOP实现   与AspectJ的静态代理不同,Spring AOP使用的动态代理,所谓的动态代理...

spinachgit
02/21
0
0

没有更多内容

加载失败,请刷新页面

加载更多

设计模式-适配器模式

一、什么是适配器? 适配器就是一种适配中间件,将两种不匹配的东西进行适配连接,举一个生活中的例子。小金最近买了最新款的macbook pro,但是发现电脑的数据接口都变成了Type c接口,这导致...

kimyeongnam
31分钟前
2
0
在没有 Emacs 的情况下使用 Org 模式

每到年初似乎总有这么一个疯狂的冲动来寻找提高生产率的方法。新年决心,正确地开始一年的冲动,以及“向前看”的态度都是这种冲动的表现。软件推荐通常都会选择闭源和专利软件。但这不是必须...

linux-tao
43分钟前
3
0
Krpano skin_settings解释

<skin_settings maps="false" 是否显示地图按钮 maps_type="google" 地图类型 maps_bing_api_key="" bing地图授权key maps_google_......

华山猛男
45分钟前
3
0
兼容率达78%!首份Android Q版本兼容性评测报告出炉

据《Android Q Beta 1版本—国内主流千款典型应用兼容性测试数据评测报告》显示,该版本兼容率为78%。 那么,千款主流应用在Android Q版本兼容情况表现如何,不兼容的主要原因是什么,又将如...

安卓绿色联盟
47分钟前
2
0
二维数组排序

以二维数组$arr中apply_num为数字降序排列:array_multisort(array_column($arr,'apply_num'),SORT_DESC,SORT_NUMERIC,$arr);...

郭周园
52分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部