/**
* 普通类 未实现接口的类 如果实现了接口的类默认使用JDK动态代理
* @author zzcy
*
*/
public class Cat {
public void add(){
System.out.println("我养了一只猫。");
}
}
/**
* CGLIB是针对类实现代理,主要是对指定的类生成一个子类,覆盖其中的方法
* 因为是继承,所以该类或方法最好不要声明成final
* @author zzcy
*
*/
public class CGLibProxy implements MethodInterceptor{
//需要代理的真实对象
private Object targetObject;
//创建代理对象
public Object createProxyObject(Object obj) {
this.targetObject = obj;
//创建加强器,用来创建动态代理类
Enhancer enhancer = new Enhancer();
//为加强器指定要代理的业务类(即:为下面生成的代理类指定父类)
enhancer.setSuperclass(this.targetObject.getClass());
//设置回调:对于代理类上所有方法的调用,都会调用CallBack,而Callback则需要
//实现intercept()方法进行拦截
enhancer.setCallback(this);
// 创建动态代理类对象并返回
Object proxyObj = enhancer.create();
return proxyObj;
}
public void beforeM(){
System.out.println("预处理···");
}
public void afterM(){
System.out.println("处理后···");
}
//回调方法
@Override
public Object intercept(Object object, Method method, Object[] arg, MethodProxy methodProxy) throws Throwable {
beforeM();
//调用业务类(父类中)的方法
Object result = methodProxy.invokeSuper(object, arg);
//System.out.println(method.getName());
//System.out.println(methodProxy.getSuperName());
afterM();
return result;
}
public static void main(String[] args) {
Cat cat = new Cat();
CGLibProxy cgLibProxy = new CGLibProxy();
Cat catProxy = (Cat) cgLibProxy.createProxyObject(cat);
catProxy.add();
}
/*JDK动态代理和CGLIB字节码生成的区别
(1)JDK动态代理只能对实现了接口的类生成代理,而不能针对类
JDK动态代理所用到的代理类在程序调用到代理类对象时才由JVM真正创建,JVM根据传进来的
业务实现类对象以及方法名 ,动态地创建了一个代理类的class文件并被字节码引擎执行,
然后通过该代理类对象进行方法调用。
(2)CGLIB是针对类实现代理,主要是对指定的业务类生成一个子类,并覆盖其中业务方法实现代理
因为采用的是继承,所以不能对final修饰的类进行代理*/
// 这里需要注意的是实现MethodIntercetor接口,必须导入cglib-nodep-x.x_x.jar这个包。
// CGLib是针对类来实现代理的,他的原理是对指定的目标生成一个子类,并覆盖其中方法实现增强,
// 但因为采用的是继承,所以不能对final修饰的类进行代理。
//如何强制使用CGLIB实现AOP?
//(1)添加CGLIB库,SPRING_HOME/cglib/*.jar
//(2)在spring配置文件中加入<aop:aspectj-autoproxy proxy-target-class="true"/>
}
JDK动态代理文章请点击:
http://blog.youkuaiyun.com/renli2549/article/details/78490508