Java 静态代理

/ Java / 没有评论 / 786浏览

简介

Java 静态代理,就是设计模式中代理模式在 java 中的实现。实现方式的结构也有两种,一种是通过继承的方式实现,另一种是通过组合的方式实现,本节介绍的是使用组合的实现方式。其模型是,在原来 Client 与 RealService之 间插入一个代理类 ProxyService,变成 ProxyService 接收来自 Client 将请求,并由 ProxyService 调用 RealService 提供服务,这样ProxyService就可以在调用 RealService 的前后做代理增强逻辑,例如日志、监控、事物和安全校验等。 alt

实现方式

java 静态代理也就是代理模式的实现,相信大家都已耳熟能详,下面是实现静态代理模式的步骤,

  1. 定义一个接口
  2. 编写一个实现接口的被代理类
  3. 编写一个实现接口并持有被代理类引用的代理类 定义接口,
// 服务接口
public interface Service {
    void sayHello();
}

接口实现类,

public class RealService implements Service {
 
    @Override
    public void sayHello() {
        System.out.println("hello");
    }
}

代理类实现相同的接口,并持有被代理类对象,从而实现代理逻辑的增强,

public class ProxyService implements Service {
 
    private Service delegate;
 
    public ProxyService(Service delegate) {
        this.delegate = delegate;
    }
 
    @Override
    public void sayHello() {
        System.out.println("Do something before invoke method");
        delegate.sayHello();
        System.out.println("Do something after invoke method");
    }
}

使用代理类,

public class StaticProxyTest {
 
    @Test
    public void staticProxyTest() {
        Service realService = new RealService();
        ProxyService proxyService = new ProxyService(realService);
        proxyService.sayHello();
    }
}

小结

静态代理模型虽然简单,却是我们理解其他代理模式实现的关键,后续要介绍的 Java 动态代理、Cglib 动态代理和 Javaagent 机制本质上都是基于这个模型。

java 静态代理特点是简单快速直接易于理解。但静态代理类是以源代码文件硬编码形式存在的,模型上对被代理类有入侵;而且每个代理类只能代理一种具体的类,当代码中需要代理多种类时需要重复编码,因此实用性不强。特别是在框架中,要求不能有代码入侵时,静态代理就不再适用,而是通常采用动态代理的方式动态生成代理类,实现增强逻辑,这就是下节要讲的内容,java 动态代理。