Java开发里,代理模式很常用,在框架和业务扩展里。本文从静态代理、动态代理的原理、代码及应用,加百度SEO策略,解析核心价值。

一、代理模式概述

Java代理模式详解:静态代理与动态代理的实现与应用

代理模式是一种结构型设计,它通过一个代理对象来控制访问目标对象,达到增强功能或控制权限目的。代理类生成时间分两类:静态、动态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 {

Java代理模式详解:静态代理与动态代理的实现与应用

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(" 方法调用后增强");

Java代理模式详解:静态代理与动态代理的实现与应用

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。

《Java代理模式详解:静态代理与动态代理的实现与应用》.doc
将本文下载保存,方便收藏和打印
下载文档