我们已经在不使用 aspectj 的情况下将 spring AOP 实现到我们的应用程序中。 我们将自动代理设置为 true 以使其使用 CGLIB 代理。
之所以我们把它做成代理 objective-c lass='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;
}
}
最佳答案
CGLIB 应该更快,JDK 代理在内部使用反射(参见 Spring 的 JdkDynamicAopProxy),CGLIB 代理直接通过生成的代码调用目标方法
关于java - 在没有aspectj的情况下,使用cglib或jdk代理的spring aop哪个是高性能的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23556819/