静态代理是代理的一种实现方式,在Spring AOP也有涉及,下面我就来详解静态代理@mikechen
静态代理定义
静态代理是一种设计模式,它通过创建一个代理对象,来控制对原始对象的访问。
在静态代理中,代理类是在编译期间就已经创建好了,并且代理类与原始类实现相同的接口,代理类中持有一个对原始类的引用。
静态代理作用
静态代理的作用主要是在不改变目标对象的前提下,对目标对象的功能进行扩展和增强。
静态代理常用的场景包括:日志记录、事务处理、权限控制等。
静态代理的缺点
静态代理的优点
静态代理的优点是实现简单,易于理解和调试。
静态代理的缺点
虽然静态代理的实现比较简单,但是每个被代理对象都需要创建一个代理类,因此在代理对象比较多时,会导致代码冗余和维护成本增加。
如果代理类和目标类接口发生变化,就需要重新编写代理类的源代码,因此静态代理通常适用于代理类和目标类的接口比较稳定,且代理类只需要代理一个目标类的情况。
静态代理使用示例
1.定义一个接口
该接口定义了目标对象的行为,静态代理对象需要实现该接口,以实现对目标对象的代理。
如下所示:
public interface Subject { void request(); }
2.实现目标对象
实现该接口的目标对象,它是真正实现业务逻辑的对象。
如下所示:
public class RealSubject implements Subject { public void request() { System.out.println("RealSubject request() method is called."); } }
3.实现代理对象
代理对象也需要实现上述接口,它包含一个对目标对象的引用,可以在该对象上执行额外的操作。
如下所示:
public class ProxySubject implements Subject { private Subject realSubject; public ProxySubject(Subject realSubject) { this.realSubject = realSubject; } public void request() { // 在目标对象执行前的操作 System.out.println("ProxySubject before request() method is called."); // 执行目标对象的方法 realSubject.request(); // 在目标对象执行后的操作 System.out.println("ProxySubject after request() method is called."); } }
4.静态代理使用
在客户端代码中,创建目标对象和代理对象,并使用代理对象调用目标对象的方法。
public static void main(String[] args) { Subject realSubject = new RealSubject(); Subject proxySubject = new ProxySubject(realSubject); proxySubject.request(); }
输出:
ProxySubject before request() method is called. RealSubject request() method is called. ProxySubject after request() method is called.
以上就是静态代理详解,更多内容请查看:Java代理模式详解(定义实现及应用场景)
如果还想了解动态代理,请查看:静态代理和动态代理的区别(4大区别详解)