Spring静态代理和动态代理概念及使用方法是什么
更新时间:2023-07-15什么是代理模式
代理模式作为一种设计模式,在程序开发中广泛应用。其定义是:为其他对象提供一种代理以控制对这个对象的访问。代理对象在客户端和目标对象之间起到了中介的作用,服务端运行的业务代码和客户端的访问代码可以分开,互不干扰,这样既减少了代码的维护难度,也降低了程序开发的复杂性。
静态代理
静态代理是指在程序运行前即已经存在代理的情况下使用的代理方式。可以通过手动编写代码来实现,但是这样区别于其他设计模式,静态代理不够灵活。下面是一个静态代理的示例:
// 抽象接口 interface IService { void execute(); } // 具体实现类 class Service implements IService { @Override public void execute() { System.out.println("execute service"); } } // 静态代理类 class StaticProxy implements IService { IService service = new Service(); @Override public void execute() { System.out.println("execute before"); service.execute(); System.out.println("execute after"); } } // 测试代码 IService staticProxy = new StaticProxy(); staticProxy.execute();
动态代理
动态代理是指在程序运行时动态地生成代理的情况下使用的代理方式。Java中提供的动态代理基于接口实现,在程序运行时动态生成代理对象,不用再手动编写代码,使用起来更加灵活。下面是一个动态代理的示例:
// 抽象接口 interface IService { void execute(); } // 具体实现类 class Service implements IService { @Override public void execute() { System.out.println("execute service"); } } // 动态代理类 class DynamicProxy implements InvocationHandler { private Object target; public DynamicProxy(Object target) { this.target = target; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("execute before"); Object result = method.invoke(target, args); System.out.println("execute after"); return result; } } // 测试代码 IService service = new Service(); IService dynamicProxy = (IService) Proxy.newProxyInstance( service.getClass().getClassLoader(), service.getClass().getInterfaces(), new DynamicProxy(service)); dynamicProxy.execute();
总结
静态代理和动态代理都是代理模式的具体应用。它们的实现方式不同,静态代理是通过手动编写代码实现代理,动态代理是在程序运行时动态生成代理对象。动态代理相对于静态代理更加灵活,但是也需要了解其实现方式和使用场景,避免滥用。