我们在不使用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;
}
}
答案 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。