使用没有aspectj的cglib或jdk代理在spring aop中的高性能?

时间:2014-05-09 04:49:11

标签: java spring proxy aop cglib

我们在不使用aspectj的情况下将spring AOP实现到我们的应用程序中。 我们将auto proxy设为true,以使其使用CGLIB代理。

我们将其作为代理目标类的原因=' true'解决代理错误。作为副作用,应用程序变得缓慢并且需要更长的时间来执行。

有没有办法解决这个问题,这有助于我们保持性能不变并避免代理错误。

<!-- Aspects -->
    <bean id="loggingAspect" class="web.aspect.LogAspectAroundMethod" />
    <!-- PointCut -->
    <bean id="myLogPointCut" class="org.springframework.aop.support.JdkRegexpMethodPointcut">
    <property name="pattern" value=".*" />
    <property name="excludedPatterns">
    <list>
    <value>.*.isDaemon.*</value>
    </list>
    </property>
    </bean>

    <!-- Advisor Around-->
    <bean id="myLogAroundAdvisor" class="org.springframework.aop.support.DefaultBeanFactoryPointcutAdvisor">
      <property name="adviceBeanName" value="loggingAspect" />
      <property name="pointcut" ref="myLogPointCut" />
    </bean>

    <bean id="aprProxy" class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
    <property name="proxyTargetClass" value="true"/>
    <property name="beanNames">
    <value>*Delegate,*Builder*,*Impl*,*Controller,*Handler,*Helper</value>
    </property>
    <property name="interceptorNames">
    <list>
    <value>myLogAroundAdvisor</value>
    </list>
    </property>
    </bean>

顾问代码如下: -

仅提供实施部分: -

    import org.aopalliance.intercept.MethodInterceptor;
    import org.aopalliance.intercept.MethodInvocation;

    public class LogAspectAroundMethod implements MethodInterceptor{

        public Object invoke(MethodInvocation methodInvocation) throws Throwable {

               Object result = methodInvocation.proceed();
               return result;
        }

}

3 个答案:

答案 0 :(得分:0)

CGLIB应该更快,JDK代理在内部使用反射(参见Spring的JdkDynamicAopProxy),CGLIB代理直接通过生成的代码调用目标方法

答案 1 :(得分:0)

什么是慢?一切已经设置好后,启动性能或性能如何?我可能不知道JdkRegexpMethodPointcut可能存在性能问题。也许它是大量创建的代理,你似乎匹配了很多类和方法。此外,您的建议本身可能会很慢。你没有在这里展示它们。如果您的建议只是调用proceed()而没有其他任何操作,会发生什么?您是否需要around()建议或before()after()是否足够?很多未解决的问题尝试差异调试,即一次改变一件事。首先,根据建议忽略建议,以了解其性能影响。还要考虑使用普通的AspectJ匹配语法而不是正则表达式匹配,也许这很慢。然后尝试匹配更少的类并衡量影响。

最后但同样重要的是,即使您不想听,也请考虑不需要任何代理的AspectJ。特别是对于编译时编织,您还可以最大限度地减少对启动时间的影响。

答案 2 :(得分:0)

我看到的一个问题是与JdkRegexpMethodPointcut的使用相结合创建的代理数量。

在确定是否需要执行建议时,有两个部分在起作用。首先是切入点的静态部分。这基本上是创建代理的点,在这种情况下,基于名称。你似乎有一些需要应用建议的bean。

其次,在代理上为每个方法调用执行的动态部分。在您的情况下,这是一个基于JDK的正则表达式,执行该表达式以确定方法名称是否匹配。现在已知JDK regexp强制要求比其他实现慢。

我希望代理数量与正则表达式相结合会降低您的应用程序速度。

我强烈建议您尝试说服您的公司并允许使用AspectJ,为什么使用数百万开发人员使用的框架会有风险?使用AOP联盟的东西(你现在使用的东西)有更大的风险,因为用户远远少于AspectJ。