0

我正在研究使用 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;
    }
}

应用上下文:

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

.............
4

2 回答 2

0

在这个博客中找到了解决方案

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

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

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

于 2013-11-06T03:10:32.793 回答
0

我不是 Spring 的大师,但据我所知,我会尽量用语言表达出来。

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

<bean id="id_of_your_bean" class="ApplicationMonitoring" factory-method="aspectOf">
     //other stuff
</bean>
于 2013-10-28T21:33:41.243 回答