Insight 根据advisor生成Proxy过程 | AOP调用性能解疑

原创 2016年07月06日 13:04:04

疑问: 1、context 如何根据bean-factory中的advisor 生成proxy(比如@Aspect Advice作用在指定的方法)

2.AOP对方法执行性能的影响是怎样的(Proxy 的生成时机?、方法执行会动态匹配Advice ?)

...

需要明确的是:

a.spring初始化的过程中,BeanFactory.initializeBean会在post-bean 阶段委托bean-post-processor进行处理。

b.关于是否生成AOP代理由bean-post-processor: AbstractAutoProxyCreator完成。

...

processor调用postProcessAfterInitialization、wrapIfNecessary,关键处理如下所示:

// Create proxy if we have advice.
// bean初始化过程中,find匹配到的Advice,作为构造Proxy的intercepter
Object[] specificInterceptors = getAdvicesAndAdvisorsForBean(bean.getClass(), beanName, null);
if (specificInterceptors != DO_NOT_PROXY) {
   this.advisedBeans.put(cacheKey, Boolean.TRUE);
   // !动态Proxy(cglib、JDKProxy)
   Object proxy = createProxy(bean.getClass(), beanName, specificInterceptors, new SingletonTargetSource(bean));
   this.proxyTypes.put(cacheKey, proxy.getClass());
   return proxy;
}

...

委托CglibAopProxy生成代理类(此时,class已经生成),Proxy class列表如下:

RedisDataServiceImpl$$EnhancerBySpringCGLIB$$26df96fd$$FastClassBySpringCGLIB$$86cb2da1.class
// 真正的Proxy Class(CglibAopProxy 生成)
RedisDataServiceImpl$$EnhancerBySpringCGLIB$$26df96fd.class
// Cglib FastClass
RedisDataServiceImpl$$FastClassBySpringCGLIB$$6bf6a919.class
// 原有的实现Class
RedisDataServiceImpl.class

-------------------------------------------------------------------------------------------------------------------

涉及到AOP方法的调用:
入口 CglibAopProxy$DynamicAdvisedInterceptor.intercept()
构造MethodInvocation,委托method进行targetClass 方法调用。interceptors信息全部在proxy (反编译导出的代理类,不如debug 过程中看的清楚)
retVal = new CglibMethodInvocation(proxy, target, method, args, targetClass, chain, methodProxy).proceed();
在调用过程中可以看到,在Spring 容器的初始化过程中,随着bean的初始化,代理类提前完成生成、初始化。不会在方法执行过程中再做这些事情,调用过程中只有invokeJoinpointUsingReflection();


结论:

1.参考AbstractAutowireCapableBeanFactory.initializeBean(),Bean初始化过程-AfterPost阶段,会有APC.wrapProxyIfNecessary的过程,此时会查找匹配的Advice并生成Proxy instance,最后将proxy 暴露给bean-factory。

2.注入的bean就是上述的Proxy instance,正常方法调用时,由Proxy类发起调用,根据Advice 的类型,决定调用的顺序,没有动态匹配Advisor过程,性能的影响主要是invokeUsingReflection造成的。

method.invoke(target, args)

3.Advice方法Class内部调用,interceptor不会生效,从Proxy class 列表看,是由完全不同的类发起调用,只是从源码中无法感知。

4.Java查看动态代理生成的代码 http://www.cnblogs.com/ctgulong/p/5011614.html


附带AopProxyFactory实现:

// 根据Interface决定采用JDK动态代理或者Cglib动态代理
public AopProxy createAopProxy(AdvisedSupport config) throws AopConfigException {
   if (config.isOptimize() || config.isProxyTargetClass() || hasNoUserSuppliedProxyInterfaces(config)) {
      Class targetClass = config.getTargetClass();
      if (targetClass == null) {
         throw new AopConfigException("TargetSource cannot determine target class: " +
               "Either an interface or a target is required for proxy creation.");
      }
      if (targetClass.isInterface()) {
         return new JdkDynamicAopProxy(config);
      }
      return CglibProxyFactory.createCglibProxy(config);
   }
   else {
      return new JdkDynamicAopProxy(config);
   }
}




版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/tt50335971/article/details/51837366

<aop:aspect>与<aop:advisor>的区别

在开发过程中,不少有Spring Aop的使用,大多数情况下我们用的是< aop:aspect>,只有在进行事务管理时才用到< aop:advisor>。但是,一直没弄清楚< aop:aspect>与...
  • u011983531
  • u011983531
  • 2017-04-23 15:44:12
  • 8093

spring Aop中aop:advisor 与 aop:aspect的区别 【爱玩酷java php 学习路径】

来自 爱玩酷的java php 学习路径
  • liubag
  • liubag
  • 2017-08-04 17:09:51
  • 660

Spring Aop(十六)——编程式的自定义Advisor

编程式的自定义Advisor概述大多数情况下,我们的Aop应用都可以通过Spring的Aop配置来进行(不管是基于注解的,还是基于XML配置的)。Spring Aop的核心就是Advisor,Advi...
  • elim168
  • elim168
  • 2017-11-04 20:48:36
  • 1205

Spring AOP中Pointcut,dvice 和 Advisor三个概念

Spring  AOP中Pointcut,dvice 和 Advisor三个概念介绍 在理解了Spring的AOP后,需要重点理解的三个概念是:Pointcut    Advice   Advi...
  • lovesimly
  • lovesimly
  • 2016-08-05 10:59:31
  • 1925

spring Aop中aop:advisor 与 aop:aspect的区别

在spring的配置中,会用到这两个标签.那么他们的区别是什么呢?      //切面代码     使用配置时,     如果切面代码是自动注入的bean,那么的ref属性直接写be...
  • u011710466
  • u011710466
  • 2016-10-21 23:34:34
  • 13764

Spring Aop中的advisor、advice、pointcut

pointcut表示指的是程序运行中的某个阶段点,如某个方法调用、异常抛出等。Pointcut是Join Point的集合,它是程序中需要注入Advice的位置的集合,指明Advice要在什么样的条件...
  • yalishadaa
  • yalishadaa
  • 2017-04-28 15:13:24
  • 458

Spring中切面的<aop:advisor pointcut="execution参数解析

都知道, 其目的就是用来匹配某些方法的。 以 为例讲解 首先:这个表达式是分为4块的,即:方法返回类型 包 +(子包)+ 方法名 + 参数个数或者类型 1、第一个 * 表示:对任意的返回类型方...
  • Raynaing
  • Raynaing
  • 2016-05-18 10:56:01
  • 1657

Spring的aop顺序

AnnotationAwareAspectJAutoProxyCreator的父类实现了SmartInstantiationAwareBeanPostProcessor, SmartInstanti...
  • gaboolic
  • gaboolic
  • 2014-09-12 16:11:34
  • 2857

编程式实现Spring AOP 引入(Introduction)和切面(Advisor)

Spring Introduction(引入),Spring Advisor(切面)
  • zyhlwzy
  • zyhlwzy
  • 2017-04-21 14:03:21
  • 337

aop:Aspect与aop:Advisor

aop:Aspect bean id="aspect" class="cn.javass.spring.chapter6.aop.HelloWorldAspect"/> aop:conf...
  • jvortex
  • jvortex
  • 2017-06-28 22:50:51
  • 357
收藏助手
不良信息举报
您举报文章:Insight 根据advisor生成Proxy过程 | AOP调用性能解疑
举报原因:
原因补充:

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