首先动态代理需要用到反射技术,
反射:
优点:只要配置就可以生成对象
缺点:运行比较慢
动态代理:
在真实对象访问之前或者之后加入对应的逻辑,或者根据其他规则控制是否使用真实对象
JDK动态代理:
1.建立起代理对象和真实服务对象的关系
2.实现代理逻辑
JDK动态代理必须提供接口才能使用,在一些不能提供接口的环境中,只能采用其他第三方技术(CGLIB)
CGLIB:
优势:
不需要提供接口,只要一个非抽象类就可以实现动态代理
被代理类:
public class ReflectServiceImpl {
public void sayHello(String name){
System.out.println("Hello "+name);
}
}
代理类:
public class cglibProxyExample implements MethodInterceptor{
/**
* 生成CGLIB代理对象
* @param cls ————CLass类
* @return Class类的CGLIB代理对象
* */
public Object getProxy(Class cls){
//CGLIB enhancer 增强类对象
Enhancer enhancer = new Enhancer();
//设置增强类型
enhancer.setSuperclass(cls);
//定义代理逻辑对象为当前对象,要求当前对象实现MethodInterceptor方法
enhancer.setCallback(this);
//生成并返回代理对象
return enhancer.create();
}
/**
* 代理逻辑方法
* @param proxy 代理对象
* @param method 方法
* @param args 方法参数
* @param methodProxy 方法代理
* @return 代理逻辑返回
* @throws Throwable 异常
* */
public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
System.err.println("调用真实对象前");
//CGLIB反射调用真实对象方法
Object result = methodProxy.invokeSuper(proxy, args);
System.err.println("调用真实对象之后");
return result;
}
}