spring Aop 实现原理

Aop(面向切面思想,不是指Spring Aop):面向切面编程,Aop的实现分为两种,动态切面(运行期织入增强代码)和静态切面(编译器在编译期织入)。静态切面是AspectJ,Spring Aop采用动态切面,即jdk动态代理和CGLIB动态代理来实现。Spring默认是使用jdk动态代理实现Aop。

在spring的实现原理中主要关注两个方面:

  • 1.动态代理对象AopProxy是如何创建的
  • 2.动态代理的拦截器对象是如何完成横切面的织入的

Spring Aop 代理对象的生成

Spring提供了两种方式来生成代理对象: JDKProxy和Cglib,默认的策略是如果目标类是接口,则使用JDK动态代理技术,否则使用Cglib来生成代理。下面就来分析一下如何使用JDK来生成动态代理对象。具体的生成代码放在JdkDynamicAopProxy这个类中

/**
    * <ol>
    * <li>获取代理类要实现的接口,除了Advised对象中配置的,还会加上SpringProxy, Advised(opaque=false)
    * <li>检查上面得到的接口中有没有定义 equals或者hashcode的接口
    * <li>调用Proxy.newProxyInstance创建代理对象
    * </ol>
    */
   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);
       findDefinedEqualsAndHashCodeMethods(proxiedInterfaces);
       return Proxy.newProxyInstance(classLoader, proxiedInterfaces, this);
}

该类本身实现了InvocationHandler接口和invoke方法,这个invoke方法是Proxy代理对象的回调方法,也就是说在代理对象本身在Proxy代理的接口方法被调用时,会去调用invoke方法。下面我们就来分析JdkDynamicAopProxy的invoke方法,这个回调方法完成了Aop编织实现的封装

在这里插入代码片

拦截器链调用

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

诗琪小姐姐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值