Java 的静态代理使用

大纲

静态代理的介绍

静态代理是 Java 中的一种设计模式,用于为目标对象提供额外的功能或控制访问目标对象的操作。它的基本思想是通过创建一个代理类,代理类具有与目标对象相同的接口或方法,并在代理类的方法中调用目标对象的对应方法。代理类可以在调用目标对象方法的前后添加额外的逻辑,比如权限检查、日志记录、事务处理等。

静态代理的关键点

  • 代理类和目标对象实现相同的接口:代理类和目标对象都实现同一个接口,这样客户端可以通过代理类来间接调用目标对象的方法。
  • 代理类控制对目标对象的访问:代理类持有目标对象的引用,并在实现接口方法时调用目标对象的对应方法。同时,代理类可以在调用目标对象的方法前后添加一些额外的操作。
  • 静态代理是编译时确定的:代理类的代码是静态定义的,也就是说代理类的结构在编译时就已经确定了,因此称为静态代理。

静态代理的优点

  • 控制访问:可以在不修改目标对象代码的情况下控制对目标对象的访问。
  • 增强功能:可以在代理类中增加额外的功能,例如日志记录、安全检查等。

静态代理的缺点

  • 代码冗余:每一个目标类都需要一个对应的代理类,这会导致代码量增多,维护起来不方便。
  • 不灵活:由于代理类和目标类是静态绑定的,所以无法动态地为不同的目标类生成代理类。

静态代理的使用

  • 定义接口
1
2
3
4
5
public interface PayService {

public void pay();

}
  • 定义实现类
1
2
3
4
5
6
7
8
public class PayServiceImpl implements PayService {

@Override
public void pay() {
System.out.println("正在处理支付业务 ...");
}

}
  • 定义代理类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
public class PayProxy implements PayService {

private PayService payService;

/**
* 构造方法
*/
public PayProxy(PayService payService) {
this.payService = payService;
}

public void before() {
System.out.println("-----before,开始支付");
}

@Override
public void pay() {
before();
payService.pay();
after();
}

public void after() {
System.out.println("-----after,完成支付");
}

}
  • 定义测试类
1
2
3
4
5
6
7
8
public class PayTest {

public static void main(String[] args) {
PayService payService = new PayProxy(new PayServiceImpl());
payService.pay();
}

}

程序运行后输出的结果:

1
2
3
-----before,开始支付
正在处理支付业务 ...
-----after,完成支付