Spring AOP用两种动态代理机制:

    1. JDK标准动态代理
    2. CGLIB动态代理

    CGLIB动态代理需要引入CGLIB的相关开源库(包含在spring-core中)。

    如果目标对象至少实现了一个接口,那么会使用JDK动态代理。所有该对象实现的接口都会被代理。如果目标对象没有实现任何接口,则会使用CGLIB动态代理。

    如果你想强制所有代理都使用CGLIB代理方式,那么需要考虑两个问题:

    • 使用CGLIB,final方法将无法被切点匹配到,因为在运行时,创建的子类无法覆盖此方法
    • 在Spring 4.0中,代理对象的构造方法不会被调用两次。

    通过以下配置,强制使用CGLIB:

    xml配置方式

    1. <aop:config proxy-target-class="true">
    2. <!-- other beans defined here... -->
    3. </aop:config>

    开启注解的方式

    1. <aop:aspectj-autoproxy proxy-target-class="true"/>