相比静态代理和动态代理,Cglib代理可谓是备受推崇,首先它不用向静态代理和动态代理那样实现接口,其次它更方便了为我们提供了拦截器的一些接口,是我们能够更好的对一些方法的控制。下面看代码吧。
第一种比较简单的例子,只是单纯的运用了Cglib代理。运用Cglib代理需要ASM包支持,Spring3.2.5核心包里面包含了asm包这里给出MAVEN的依赖
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>3.2.5.RELEASE</version>
</dependency>
需要被代理的类,名字起的不太好。
public class UserDao {
public void doField(){
System.out.println("开始学习Cglib代理------------------------");
}
public void eat(){
System.out.println("吃吃吃吃吃-------------------");
}
public void pay(){
System.out.println("买买买买买-------------------");
}
}
代理的类,需要继承MethodIntercepeor,然后实现接口里为我们提供的唯一的一个方法intercept在这里我们可以通过Method.invoke()方法达到调用目标类,这里不用像jdk动态代理那样需要绑定接口,我们需要创建一个Enhancer用于创建代理类,首先要设置他的父类,个人理解,与动态代理需要绑定接口相比,Cglib代理应该是生成了一个子类用于代理,然后设置回调,对于回调函数的理解就是一个人在做某件事的时候,做到一半暂停了,然后等别人做完一件事,给出反馈,然后继续完成自己的这件事,设置回调必须实现了CallBack
public class ProxyFactory implements MethodInterceptor {
private Object object;
public ProxyFactory(Object object) {
this.object = object;
}
public Object getProxyInstance() {
Enhancer en = new Enhancer();
en.setSuperclass(object.getClass());
en.setCallback(this);
return en.create();
}
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
System.out.println("我开始工作了");
Object returnValue = method.invoke(object, objects);
System.out.println("我结束工作了");
return returnValue;
}
}
测试类:
public class Client {
public static void main(String args[]){
UserDao proxy = (UserDao) new ProxyFactory(new UserDao()).getProxyInstance();
proxy.doField();
}
}
测试结果
我开始工作了
开始学习Cglib代理------------------------
我结束工作了
只是简单的运用了一下Cglib代理,下面总结一下Cglib在拦截器上的运用