@Aspect
@Component
public class ResponseTimeLoggerAspect {
private final Logger logger = LoggerFactory.getLogger(this.getClass().getCanonicalName());
@Around("requestHandlerMethod()")
public void logResponseTime(ProceedingJoinPoint point) {
long startTime = System.currentTimeMillis();
try {
point.proceed();
}
catch (Throwable e) {
}
long timeTaken = System.currentTimeMillis() - startTime;
logger.info(point.getSignature().getName() + " took " + timeTaken + " ms.");
}
@Pointcut("execution(* com.jms.JMSMessageListener.*(..))")
public void requestHandlerMethod() {}
}
@Configuration
@Import({JMSConfig.class, Neo4jConfig.class})
@ComponentScan(basePackageClasses=BeansPackageMarker.class)
@EnableAspectJAutoProxy
public class ApplicationConfig {
}
异常(exception):
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.jms.JMSMessageListener] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {}
如果我通过从 ApplicationConfig
注释掉 @EnableAspectJAutoProxy
来禁用该方面,它不会抛出任何异常,但不会执行任何方面J建议(如预期)。
在我看来,通过启用aspectJ,Spring认识到该建议适用于JMSMessageListener
,因此它围绕它创建一个代理,这就是Spring无法 Autowiring JMSMessageListener
的原因code> bean 因为现在该 bean 不存在,但该 bean 上的代理存在。
最佳答案
正如@Evgeni正确指出的那样,它是通过改变来起作用的
@EnableAspectJAutoProxy
至
@EnableAspectJAutoProxy(proxyTargetClass=true)
它启用基于 CGLIB 的代理(默认情况下启用基于 DynamicJDK 的代理)
目标类还必须有一个默认构造函数。这是基于 CGLIB 的代理工作的要求。
关于Spring AOP 使用 bean Autowiring 创建问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25079618/