Spring AOP 使用 bean Autowiring 创建问题

标签 spring aspectj spring-aop

@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/

相关文章:

spring - 使用 QueryDsl 谓词和 spring jpa 按降序排序从结果集中获取第一行

Spring WebFlux - bodyType=org.springframework.web.multipart.MultipartFile 不支持内容类型 'application/xml'

java - 在avice周围,如何获取advice方法的参数 'type parameter'

java - 如何从 ValueStack 中删除操作?

java - 尝试在 spring 中保留消息属性文件列表时出错

java - spectj:如何将库中的方面编织到用户代码中?

java - Aspect 不适用于带有外部 jar 的 Spring Boot 应用程序

java - @AspectJ 以注解作为方法参数的类级注解建议

java - 从 cmd 运行时 Spring AOP 不工作

java - 使用 AspectJ spring-aop 改变返回值的类型