动态代理
一,动态代理快速入门

代码实现:
//要被代理的方法接口
public interface Star {
public String sing(String name);
public void dance( );
}
//要被代理的类
public class BigStar implements Star{
private String name;
public BigStar(String name) {
this.name = name;
}
public String sing(String name){
System.out.println(this.name+"正在唱"+name);
return "thanks";
}
public void dance( ){
System.out.println(this.name+"正在跳舞");
}
}
//代理创建的工具类
public class ProxyUtil {
public static Star createProxy(BigStar bigStar){
Star starProxy = (Star)Proxy.newProxyInstance(
ProxyUtil.class.getClassLoader(),// 获取类加载器,一般都是获取当前类的类加载器
new Class[]{Star.class},// 用来指定生成的代理类实现的接口
new InvocationHandler() {//用来指定代理要做的事情
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//三个参数:
//proxy:代理对象
//method:被代理对象的方法
//args:被代理对象的方法的参数
if("sing".equals(method.getName())){
System.out.println("代理对象要做的事情sing");
}else if("dance".equals(method.getName())){
System.out.println("代理对象要做的事情dance");
}
return method.invoke(bigStar,args);
}
}
);
return starProxy;
}
}
//测试类
public class ProxyDemo {
public static void main(String[] args) {
BigStar star = new BigStar("周杰伦");
Star starProxy = ProxyUtil.createProxy(star);
String res = starProxy.sing("好日子");
System.out.println(res);
}
}
二,动态代理的应用场景
动态代理是一种设计模式,可以在程序运行时动态地生成代理对象,代理对象能够代替实际对象并为其提供附加功能。动态代理广泛应用于各种场景中,以下是一些常见的应用场景:
-
AOP(面向切面编程):
-
日志记录:在方法执行前后记录日志。
-
性能监控:统计方法执行时间。
-
事务管理:在方法执行前开启事务,执行完后提交或回滚事务。
-
安全检查:在方法调用前进行权限验证。
-
-
远程调用(RPC):
- 动态代理可以简化客户端和服务器之间的通信过程。客户端可以调用本地接口,动态代理将请求转发到远程服务器并返回结果。
-
懒加载(Lazy Loading):
- 当需要延迟加载某些资源时,可以使用动态代理来控制资源的加载时机。只有在实际访问资源时,代理才会加载资源。
-
代理模式(Proxy Pattern):
- 在需要为某个对象提供额外功能(如缓存、延迟初始化等)时,可以使用动态代理来封装实际对象并添加这些功能。
-
拦截器(Interceptor):
- 动态代理可以用来实现拦截器,对方法调用进行拦截和处理。常用于过滤器、校验器等场景。
-
Mock对象:
- 在单元测试中,动态代理可以用来创建Mock对象,模拟实际对象的行为,便于测试
-
事件处理:
- 动态代理可以用来实现事件处理机制,在事件触发时自动调用指定方法。
这些都是底层通过动态代理来实现的,我们不需要掌握如何使用它,只需要知道它即可,因为在Spring框架中一般采用AOP技术来更简便的实现动态代理的功能。

浙公网安备 33010602011771号