1. public Object getProxy(@Nullable ClassLoader classLoader) {
    2. return createAopProxy().getProxy(classLoader);
    3. }

    创建 Aop 代理

    1. protected final synchronized AopProxy createAopProxy() {
    2. // 激活代理标志,添加监听器
    3. if (!this.active) {
    4. activate();
    5. }
    6. // 默认 DefaultAopProxyFactory
    7. return getAopProxyFactory().createAopProxy(this);
    8. }

    获得 Aop 代理工厂

    1. public ProxyCreatorSupport() {
    2. this.aopProxyFactory = new DefaultAopProxyFactory();
    3. }
    4. public AopProxyFactory getAopProxyFactory() {
    5. return this.aopProxyFactory;
    6. }

    Aop 代理工厂获取 Aop 代理

    1. @Override
    2. public AopProxy createAopProxy(AdvisedSupport config) throws AopConfigException {
    3. /*
    4. config.isOptimize() : 默认为false
    5. config.isProxyTargetClass() : 配置 <aop:aspectj-autoproxy proxy-target-class="true"/> 则为true
    6. hasNoUserSuppliedProxyInterfaces(config): 代理对象是否有接口或者有一个SpringProxy接口
    7. */
    8. if (config.isOptimize() || config.isProxyTargetClass() || hasNoUserSuppliedProxyInterfaces(config)) {
    9. Class<?> targetClass = config.getTargetClass();
    10. // 参数校验
    11. if (targetClass == null) {
    12. throw new AopConfigException("TargetSource cannot determine target class: " +
    13. "Either an interface or a target is required for proxy creation.");
    14. }
    15. // 如果代理对象是接口或者使用Proxy.newProxyInstance创建的代理,那么使用JDK代理
    16. if (targetClass.isInterface() || Proxy.isProxyClass(targetClass)) {
    17. return new JdkDynamicAopProxy(config);
    18. }
    19. // 代理对象不是接口,那么就得用cglib代理
    20. return new ObjenesisCglibAopProxy(config);
    21. } else {
    22. // 上面的条件不满足,那么都JDK代理
    23. return new JdkDynamicAopProxy(config);
    24. }
    25. }

    上面的调用链有点磨叽: 工厂获取AOP代理 - 图1

    1. 首先是 ProxyFactory#getProxy;
    2. 那么来到了 ProxyCreatorSupport#createAopProxy,这里 getAopProxyFactory 得到了 DefaultAopProxyFactory;
    3. 继续来到了 DefaultAopProxyFactory#createAopProxy,这里得到了 JdkDynamicAopProxy 或者 ObjenesisCglibAopProxy ;
    4. 也就是说 _ProxyFactory#getProxy 方法中的 createAopProxy() 方法得到了_JdkDynamicAopProxy 或者 _ObjenesisCglibAopProxy ,然后再调用 _getProxy 得到具体的代理对象。

    到此我们获得了AOP代理 JdkDynamicAopProxy 或者 ObjenesisCglibAopProxy ,接下来调用 getProxy() 获得最后我们需要的代理对象!