代理模式
我们知道,Spring AOP的主要作用就是不通过修改源代码的方式、将非核心功能代码织入来实现对方法的增强。那么Spring AOP的底层如何实现对方法的增强?实现的关键在于使用了代理模式
代理模式的作用就是为其它对象提供一种代理,以控制对这个对象的访问,用于解决在直接访问对象时带来的各种问题。代理主要分为两种方式:静态代理和动态代理
静态代理
静态代理主要通过将目标类与代理类实现同一个接口,让代理类持有真实类对象,然后在代理类方法中调用真实类方法,在调用真实类方法的前后添加我们所需要的功能扩展代码来达到增强的目的
示例代码:
/** * 代理类与目标类的共同接口 */ public interface Subject { void request(); void response(); } /** * 目标类 */ public class RealSubject implements Subject { @Override public void request() { System.out.println("执行目标对象的request方法......"); } @Override public void response() { System.out.println("执行目标对象的response方法......"); } } /** * 代理类 */ public class ProxySubject implements Subject { private Subject subject; public ProxySubject(Subject subject) { this.subject = subject; } @Override public void request() { System.out.println("before 前置增强"); subject.request(); System.out.println("after 后置增强"); } @Override public void response() { System.out.println("before 前置增强"); subject.response(); System.out.println("after 后置增强"); } } public class Main { public static void main(String[] args) { //目标对象 Subject realSubject = new RealSubject(); //代理对象 通过构造器注入目标对象 Subject proxySubject = new ProxySubject(realSubject); proxySubject.request(); proxySubject.response(); } }运行结果:
before 前置增强 执行目标对象的request方法...... after 后置增强 before 前置增强 执行目标对象的response方法...... after 后置增强通过以上的代码示例,我们不难发现静态代理的缺点。假如我们的Subject接口要增加其它的方法,则ProxySubject代理类也必须同时代理这些新增的方法。同时我们也看到,request方法和response方法所织入的代码是一样的,这会使得代理类中出现大量冗余的代码,非常不利于扩展和维护。为了解决静态代理的这些缺陷,于是有了动态代理
动态代理
与静态代理相比,动态代理的代理类不需要程序员自己手动定义,而是在程序运行时动态生成
动态代理可以分为
