简单介绍三种代理方式,如果有不清楚的地方可以+QQ:3393055725
Java三种代理方式:静态代理,动态代理(JDK代理),cglib代理
1、静态代理:
静态代理的实现方式很简单,但是用到的不多,静态代理和动态代理使用的前提都是目标对象要实现接口,每个目标对象都要对应一个代理类
//目标对象接口
public interface ITarget {
void fun();
}
//目标对象
public class Target implements ITarget {
@Override
public void fun() {
System.out.println("调用目标对象方法");
}
}
//代理类
public class StaticProxy implements ITarget {//实现和目标对象相同的接口
private ITarget target;//目标对象
//通过构造函数创建代理对象
public StaticProxy(ITarget target) {//传参:接口对象
this.target = target;
}
@Override
public void fun() {
System.out.println("静态代理开始");
target.fun();
System.out.println("静态代理结束");
}
}
//测试类
public class Test {
public static void main(String[] args) {
//目标对象
ITarget target = new Target();
ITarget proxy = new StaticProxy(target);
proxy.fun();
}
}
2、动态代理
动态代理用到的更多一些,但是目标对象要实现接口,因为动态代理的实现需要传入接口类型, 不需要每个目标对象都对应一个代理类
//省略目标对象的接口和实现类
//...参考静态代理
//动态代理类
public class DynamicProxy {
//目标对象
private Object target;
public DynamicProxy (Object target) {
this.target = target;
}
//生成代理对象
public Object getProxy() {
return Proxy.newProxyInstance(//三个参数
target.getClass().getClassLoader(),//类加载器
target.getClass().getInterfaces(),//目标对象接口类
new InvocationHandler(){//事件处理器
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("动态代理开始");
Object returnValue = method.invoke(target, args);
System.out.println("动态代理结束");
return returnValue;
}
});
}
}
//测试类
public class Test {
ITarget target = new Target();
ITarget proxy = (ITarget) new DynamicProxy(ITarget target).getProxy();
proxy.fun();
}
3、cglib代理
cglib代理不需要目标对象实现接口,所以当目标对象没有实现接口的前提下可以使用cglib代理,使用cglib代理要引入jar包,在web工程中spring-core.jar文件中包含cglib代理文件
实现原理是为目标对象创建子类对象
// 省略目标对象类,参考静态代理实现类,但是不实现接口即可
// 实现cglib代理
public class CgligProxy implements MethodInterceptor{//实现MethodInterceptor接口
// 目标对象
private Object target;
public CglibProxy(Object target) {
this.target = target;
}
// 为目标对象创建代理对象
public Object getProxy(){
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(target.getClass());
enhancer.serCallback(this);
return enhancer.create();
}
// 重写拦截方法
@Override
public Object intercept(Object obj, Method method, Objects[] orgs, MethodProxy proxy) throw Throwable {
System.out.println("cglib代理开始");
Object returnValue = method.invoke(target, orgs);
System.out.println("cglib代理结束");
return returnValue;
}
}
// 测试类
public class Test{
// 目标对象
Target target = new Target();//这里的不是接口对象,是类对象
// 代理对象
Target proxy = (Target) new ProxyFactory(target).getProxy();
proxy.fun();
}