Spring Boot进阶:原理、实战与面试题分析
上QQ阅读APP看书,第一时间看更新

3.2 动态代理机制与Spring AOP

在Java的世界中,实现AOP的主流方式是采用动态代理(Dynamic Proxy)机制,这点对于Spring AOP也一样。代理机制的主要目的就是为其他对象提供一种代理以控制对当前对象的访问,用于消除或缓解直接访问对象带来的问题。通过这种手段,一个对象就代表另一个对象的部分功能,我们创建包含当前对象的对象,以便向外界提供功能接口。本节将关注目前主流的动态代理实现技术,并分析Spring AOP中的代理实现方式。

在Spring中,采用的代理机制有两种,即JDK动态代理和CGLIB动态代理。为了介绍动态代理机制,这里我们引入一个具体的应用场景。考虑一个Account接口,它包含一个用于图片展示的open()方法,如代码清单3-5所示。

代码清单3-5 Account接口代码

public interface Account{
    void open();
}

然后针对该接口有一个实现类RealAccount,其中的方法实现只用于模拟,不包含具体业务,如代码清单3-6所示。

代码清单3-6 Account接口实现类代码

public class RealAccount implements Account {
    private String name;

    public RealAccount(String name) {
        this.name = name;
    }

    @Override
    public void open() {
        System.out.println("Open the account for:" + name);
    }
}

现在,假设需要在执行RealAccount的open()方法的前后分别打印日志信息。我们接下来讨论如何分别基于JDK动态代理和CGLIB动态代理来实现这一目标。