我正在使用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/>
.............
答案 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)
方面是单个对象,在Spring容器外部创建。使用XML配置的解决方案是使用Spring的工厂方法来检索方面。
<bean id="monitoringAspect" class="com.myaapp.ApplicationMonitoring"
factory-method="aspectOf" />
使用此配置,该方面将被视为任何其他Spring bean,并且自动装配将正常工作。