由于JDK只能基于接口进行动态代理,所以Spring使用JDK和Cglib结合使用来产生动态代理,Cglib可以进行类的动态代理
下面就是一个简单的动态代理例子:
被代理的类
package com.lbx.dog;
public class Dog {
public void info() {
// TODO Auto-generated method stub
System.out.println("这是一只狗");
}
public void run() {
// TODO Auto-generated method stub
System.out.println("这只狗在RUN");
}
}
类似与拦截器的拦截方法
package com.lbx.proxy;
public class DogInterceptor {
public void method1(){
System.out.println("第一个拦截方法");
}
public void method2(){
System.out.println("第二个拦截方法");
}
}
代理对象的实现
package com.lbx.proxy;
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 CglibProxy implements MethodInterceptor {
private Enhancer enhancer = new Enhancer();
DogInterceptor di = new DogInterceptor();
public CglibProxy(){
}
public Object getProxy(Class c){
enhancer.setSuperclass(c);
enhancer.setCallback(this);
return enhancer.create();
}
public Object intercept(Object obj, Method method, Object[] args,
MethodProxy proxy) throws Throwable {
di.method1();
Object result = proxy.invokeSuper(obj, args);
di.method2();
return result;
}
}
测试程序
package com.lbx.test;
import com.lbx.dog.Dog;
import com.lbx.proxy.CglibProxy;
public class Test {
public static void main(String[] args) {
CglibProxy proxy = new CglibProxy();
Dog proxyDog = (Dog)proxy.getProxy(Dog.class);
proxyDog.info();
proxyDog.run();
}
}