Spring AOP用bean自动装配创建问题

时间:2014-08-01 11:50:08

标签: 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 {

}

例外:

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: {}

如果我通过从@EnableAspectJAutoProxy注释ApplicationConfig来禁用方面,它不会抛出任何异常,但不会执行aspectJ建议(如预期的那样)。

在我看来,通过启用aspectJ,Spring认识到该建议适用于JMSMessageListener,因此它围绕它创建了一个代理,这就是为什么Spring无法自动装配JMSMessageListener bean的原因,因为现在bean不在那里,但那个bean的代理就在那里。

1 个答案:

答案 0 :(得分:3)

正如@Evgeni正确指出的那样,它通过改变

起作用
@EnableAspectJAutoProxy

@EnableAspectJAutoProxy(proxyTargetClass=true)

启用基于CGLIB的代理(默认情况下启用基于DynamicJDK的代理)

目标类也必须具有默认构造函数。它是基于CGLIB的代理工作的要求。