SpringAop 原理及源码 随笔记录

原创 2016年08月29日 16:30:16

SpringAop 原理及源码 随笔记录

本Markdown编辑器使用[StackEdit][6]修改而来,用它写博客,将会带来全新的体验哦:

  • 原理:代理模式
  • 源码实现方式1:JdkDynamicAopProxy
  • 源码实现2:CglibAopProxy

原理:代理模式

这里写图片描述

源码实现方式1:JdkDynamicAopProxy

jdk自带代理模式

@Override
    public Object getProxy(ClassLoader classLoader) {
        if (logger.isDebugEnabled()) {
            logger.debug("Creating JDK dynamic proxy: target source is " + this.advised.getTargetSource());
        }
        Class<?>[] proxiedInterfaces = AopProxyUtils.completeProxiedInterfaces(this.advised, true);
        findDefinedEqualsAndHashCodeMethods(proxiedInterfaces);
        return Proxy.newProxyInstance(classLoader, proxiedInterfaces, this);
    }
... prompt'''

源码实现2:CglibAopProxy

想对于常用代理模式区别在于 将实现接口的方式改为将代理类继承至被代理类。然后进行代理模式其他操作

@Override
    public Object getProxy(ClassLoader classLoader) {
        if (logger.isDebugEnabled()) {
            logger.debug("Creating CGLIB proxy: target source is " + this.advised.getTargetSource());
        }

        try {
            Class<?> rootClass = this.advised.getTargetClass();
            Assert.state(rootClass != null, "Target class must be available for creating a CGLIB proxy");

            Class<?> proxySuperClass = rootClass;
            if (ClassUtils.isCglibProxyClass(rootClass)) {
                proxySuperClass = rootClass.getSuperclass();
                Class<?>[] additionalInterfaces = rootClass.getInterfaces();
                for (Class<?> additionalInterface : additionalInterfaces) {
                    this.advised.addInterface(additionalInterface);
                }
            }

            // Validate the class, writing log messages as necessary.
            validateClassIfNecessary(proxySuperClass, classLoader);

            // Configure CGLIB Enhancer...
            Enhancer enhancer = createEnhancer();
            if (classLoader != null) {
                enhancer.setClassLoader(classLoader);
                if (classLoader instanceof SmartClassLoader &&
                        ((SmartClassLoader) classLoader).isClassReloadable(proxySuperClass)) {
                    enhancer.setUseCache(false);
                }
            }
            enhancer.setSuperclass(proxySuperClass);
            enhancer.setInterfaces(AopProxyUtils.completeProxiedInterfaces(this.advised));
            enhancer.setNamingPolicy(SpringNamingPolicy.INSTANCE);
            enhancer.setStrategy(new ClassLoaderAwareUndeclaredThrowableStrategy(classLoader));

            Callback[] callbacks = getCallbacks(rootClass);
            Class<?>[] types = new Class<?>[callbacks.length];
            for (int x = 0; x < types.length; x++) {
                types[x] = callbacks[x].getClass();
            }
            // fixedInterceptorMap only populated at this point, after getCallbacks call above
            enhancer.setCallbackFilter(new ProxyCallbackFilter(
                    this.advised.getConfigurationOnlyCopy(), this.fixedInterceptorMap, this.fixedInterceptorOffset));
            enhancer.setCallbackTypes(types);

            // Generate the proxy class and create a proxy instance.
            return createProxyClassAndInstance(enhancer, callbacks);
        }
        catch (CodeGenerationException ex) {
            throw new AopConfigException("Could not generate CGLIB subclass of class [" +
                    this.advised.getTargetClass() + "]: " +
                    "Common causes of this problem include using a final class or a non-visible class",
                    ex);
        }
        catch (IllegalArgumentException ex) {
            throw new AopConfigException("Could not generate CGLIB subclass of class [" +
                    this.advised.getTargetClass() + "]: " +
                    "Common causes of this problem include using a final class or a non-visible class",
                    ex);
        }
        catch (Exception ex) {
            // TargetSource.getTarget() failed
            throw new AopConfigException("Unexpected AOP exception", ex);
        }
    }

spring源码剖析(六)AOP实现原理剖析

Spring的AOP实现原理,酝酿了一些日子,写博客之前信心不是很足,所以重新阅读了一边AOP的实现核心代码,而且又从网上找了一些Spring Aop剖析的例子,但是发现挂羊头买狗肉的太多,标题高大上...
  • fighterandknight
  • fighterandknight
  • 2016年04月23日 17:22
  • 18371

Spring AOP介绍及源码分析

软件开发经历了从汇编语言到高级语言和从过程化编程到面向对象编程;前者是为了提高开发效率,而后者则使用了归纳法,把具有共性的东西进行归类并使之模块化,达到便于维护和扩展的目的;如果说面向对象编程可以对业...
  • long405581649
  • long405581649
  • 2015年12月07日 17:23
  • 1885

(八)Spring核心框架 - AOP的原理及源码解析

一、AOP的体系结构 如下图所示:(引自AOP联盟) 层次3语言和开发环境:基础是指待增加对象或者目标对象;切面通常包括对于基础的增加应用;配置是指AOP体系中提供的配置环境或者编织配置,通过该配...
  • leicool_518
  • leicool_518
  • 2015年02月09日 16:31
  • 2844

SpringAOP源码解析之执行篇

阅读须知 Spring源码版本:4.3.8 注释规则: //单行注释做普通注释 /**/多行注释做深入分析 建议配合Spring源码阅读 正文上篇文章中我们分析的Spring AOP代理创建的过程...
  • heroqiang
  • heroqiang
  • 2018年01月14日 15:15
  • 17

SpringAOP源码解析

AspectJAwareAdvisorAutoProxyCreator及为Bean生成代理时机分析 上篇文章说了,org.springframework.aop.aspectj.autoproxy.A...
  • lz710117239
  • lz710117239
  • 2017年12月06日 21:04
  • 70

杨老师课堂之springAOP事务控制源码解析

spring AOP基于动态代理实现,想看懂源码必须了解动态代理和字节码增强方面的知识。 基于对spring各种配置的了解,首先我们先从DataSourse由谁来管理入手。了解AOP。 一...
  • jung285175400
  • jung285175400
  • 2016年05月20日 11:29
  • 6964

SpringAOP[4.源码解析总结(1)]

看了很久的SpringAOP源码,现在对其实现有了一定了解,在此进行一下总结,废话不多说,现在开始: 首先先要理解几个概念,这几个概念正好对应着框架里面的class,这些概念都是我自己定义的...
  • jingmiaowill
  • jingmiaowill
  • 2013年07月20日 09:25
  • 1299

SpringAOP[4.源码解析总结(2)]

上回总结了一下BeanFactory的结构,如果想对其进行深入的理解需要查看其创建和初始化步骤,下面总结一下BeanFactory的创建步骤 ApplicationContext是Bea...
  • jingmiaowill
  • jingmiaowill
  • 2013年07月21日 14:17
  • 647

杨老师课堂之springAOP事务控制源码解析

spring AOP基于动态代理实现,想看懂源码必须了解动态代理和字节码增强方面的知识。 基于对spring各种配置的了解,首先我们先从DataSourse由谁来管理入手。了解AOP。 一般来...
  • skiof007
  • skiof007
  • 2016年07月19日 15:35
  • 723

博客按键消抖试验及验证随笔及之前的源码

  • 2017年07月24日 11:28
  • 63.54MB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:SpringAop 原理及源码 随笔记录
举报原因:
原因补充:

(最多只允许输入30个字)