JDK动态代理是基于接口的方式,换句话来说就是代理类和目标类都实现同一个接口,那么代理类和目标类的方法名就一样了;CGLib动态代理是代理类去继承目标类,然后重写其中目标类的方法,这样也可以保证代理类拥有目标类的同名方法.
public class MyMethodIntercepter implements MethodInterceptor {
/*
* 第一个参数:代理的对象
* 第二个参数:对象中的方法
* 第三个参数:方法的参数
* 第四个参数:生成的代理类
**/
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
System.out.println("cglib...");
return methodProxy.invokeSuper(o,objects);
}
}
public class IndexService {
public IndexService() {
System.out.println("IndexService init....");
}
public void print(){
System.out.println("indexservice...");
}
public void quety(){
System.out.println("query.....");
}
}
public class Test01 {
public static void main(String[] args) {
Enhancer enhancer = new Enhancer();
//增强父类,cglib是基于继承的
enhancer.setSuperclass(IndexService.class);
//名字生成策略
enhancer.setNamingPolicy(SpringNamingPolicy.INSTANCE);
//过滤方法
enhancer.setCallback(new MyMethodIntercepter());
//创建代理对象
IndexService indexService = (IndexService) enhancer.create();
indexService.quety();
}
}