@Autowired不适用于拦截器

时间:2013-10-28 17:33:24

标签: java spring rest spring-aop spring-annotations

我正在使用Apache-CXF开发的REST服务。我正在使用Spring 3.1注释来连接bean。我编写了一个拦截器,拦截我的REST方法用于监视目的。要做到这一点,我必须自动装配我的Monitor类,它在我的项目中作为库添加。 @Autowired似乎在这种情况下不起作用并导致NPE。我在这里做错了吗?

@Aspect
@Component
public class ApplicationMonitoring {

Logger logger = LoggerFactory.getLogger(ApplicationMonitoring.class);

@Autowired
private Monitor monitor;

@Around("execution(* com.abc.xyz.rest.CustomerResource.getCustomerByAccountNumber(..))")
public Object invoke(ProceedingJoinPoint joinPoint) throws Throwable {
    String methodName = joinPoint.getSignature().getName();

    long start = System.currentTimeMillis();
    try {
        // proceed to original method call
        Object result = joinPoint.proceed();
        monitor.elapsedTime(methodName, System.currentTimeMillis() - start);
            return result;
    } catch (Exception e) {
        throw e;
    }
}

的ApplicationContext:

.................
......
<context:spring-configured />

<context:component-scan base-package="com.abc">
    <context:exclude-filter expression="org.springframework.stereotype.Controller"
        type="annotation" />
</context:component-scan>

<context:annotation-config/>  

.............

2 个答案:

答案 0 :(得分:0)

我不是春天的大师,但据我所知,我会尽量尽力说出来。

我想你注意到了,但@Aspect不是基于spring的,所以为了扫描你需要添加<aop:aspectj-autoproxy/>,而且我认为问题是正在创建同一个类的两个实例,每个容器(spring和AspectJ)一个,以避免我使用工厂方法将完全相同的实例检索到弹簧容器(如果我正确解释它,我不确定100% ), - 记住首先创建方面的那个 - 以这种方式:

<bean id="id_of_your_bean" class="ApplicationMonitoring" factory-method="aspectOf">
     //other stuff
</bean>

答案 1 :(得分:0)

this blog

中找到解决方案

方面是单个对象,在Spring容器外部创建。使用XML配置的解决方案是使用Spring的工厂方法来检索方面。

<bean id="monitoringAspect" class="com.myaapp.ApplicationMonitoring" 
   factory-method="aspectOf" />

使用此配置,该方面将被视为任何其他Spring bean,并且自动装配将正常工作。