Java开发里,代理模式很常用,在框架和业务扩展里。本文从静态代理、动态代理的原理、代码及应用,加百度SEO策略,解析核心价值。
一、代理模式概述
代理模式是一种结构型设计,它通过一个代理对象来控制访问目标对象,达到增强功能或控制权限目的。代理类生成时间分两类:静态、动态35。
1.1 核心角色
抽象主题(ISubject)就是给目标、代理对象一个相同接口。
真主题(RealSubject)是代理对象管的真正业务。
代理对象就是持有真对象,再加点别的操作,例如日志、权限啥的810。
二、静态代理实现
静态代理得自己写代理类,适合接口少的情况。
2.1 实现步骤
定义接口:就是主题角色,但要抽象的。
public interface Subject {
void request;
}
实现真实类,写核心业务。
public class RealSubject implements Subject {
@Override public void request {
System.out.println(" 执行真实业务逻辑");
}
}
建代理,把真实对象放一起,加功能。
public class ProxySubject implements Subject {
private RealSubject realSubject;
public ProxySubject(RealSubject realSubject) {
this.realSubject = realSubject;
}
@Override public void request {
preRequest; // 预处理 realSubject.request;
postRequest; // 后处理 }
private void preRequest {
System.out.println(" 调用前校验权限");
}
private void postRequest {
System.out.println(" 调用后记录日志");
}
}
2.2 适用场景
得对一个接口的功能增加下。
代理逻辑跟实际对象分开了,这样更灵活811。
三、动态代理实现
动态代理在运行时产生代理类,有两种方式:JDK动态代理、CGLIB代理。
3.1 JDK动态代理
依赖接口就是代理类要弄的和目标对象接口一样。
核心类:
Proxy
(生成代理类)和
InvocationHandler
(处理方法调用)。
代码示例:
java//1.定个InvocationHandler public class DynamicProxy实现了InvocationHandler{有个target对象;
public DynamicProxy(Object target) {
this.target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println(" 方法调用前增强");
Object result = method.invoke(target, args);
System.out.println(" 方法调用后增强");
return result;
}
}
生成代理对象:Subject real = new RealSubject; Subject pro = Proxy.newProxy(real.getClass.getClassLoader, real.getClass.getInterfaces, new DynamicProxy(real)); pro.request;
undefined
3.2 CGLIB动态代理
依赖子类,生成目标类子类,实现代理。
使用地方:对象没达到接口标准。
代码示例:
Enhancer enhancer = new Enhancer;
enhancer.setSuperclass(RealSubject.class);
enhancer.setCallback(new MethodInterceptor {
@Override public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
System.out.println("CGLIB 代理前增强");
Object result = proxy.invokeSuper(obj, args);
System.out.println("CGLIB 代理后增强");
return result;
}
});
RealSubject proxy = (RealSubject) enhancer.create;
proxy.request;
四、代理模式的应用场景
远程调用,RPC框架里代理对象管网络通信细节3。
AOP执行:Spring AOP利用动态代理来做日志和事务等管理工作10。
延迟加载是:系统开时,用代理晚点初始化那些费时的资源3。
权限控制:调用方法时先查用户权限8。