我希望能够使用Spring& AspectJ在加载时将一个方面编织到现有的tomcat webapp。我正在使用AspectJ,因为我需要执行构造函数切入点 我有两个测试场景,一个是我的方面是一个简单的servlet应用程序的一部分 - 应用程序包含方面的源,我使用MVN和aspectJ插件来编译WAR和Aspect。这方面按预期工作。第二种情况是我将方面分成了自己的项目并使用(我已尝试过AJC和AJDT)将其编译成JAR文件,并在我的war / WEB-INF / lib文件夹中包含jar文件。似乎在加载war文件上下文时拾取Aspect,但不应用于war文件中的任何对象。
以下是Aspect代码:
@SuppressWarnings("unused")
public aspect ProjectMonitor{
pointcut constr() : call(com.avaya..*.new(..)) ;
Object around() : constr(){
System.out.println("In Constructor for "
+ thisJoinPointStaticPart.getSignature());
Object ret = proceed();
return ret;
}
pointcut publicOperation() : execution(public * *.*(..));
Object around() : publicOperation() {
long start = System.nanoTime();
Object ret = proceed();
long end = System.nanoTime();
System.out.println(thisJoinPointStaticPart.getSignature() + " took "
+ (end - start) + " nanoseconds");
return ret;
}
pointcut callConst() : call(public *..*SCESession.new(..));
public Object callConst(ProceedingJoinPoint jp) throws Throwable {
System.out.println("In Project Monitor!!!");
return jp.proceed();
}
}
我在web app / META-INF文件夹中包含了一个aop.xml文件:
<aspectj>
<aspects>
<aspect name="com.ddvc.ivr.ProjectMonitor" />
</aspects>
</aspectj>
我的Spring Context文件看起来像这样:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<context:load-time-weaver aspectj-weaving="on" />
<context:spring-configured />
<context:component-scan base-package="com.avaya.sce.runtimecommon"/>
<context:annotation-config />
<aop:aspectj-autoproxy />
<!-- Aspect Mapping -->
<bean id="monitor" class="com.ddvc.ivr.ProjectMonitor" factory-method="aspectOf"/>
</beans>
非常简单,对吧?我甚至有一个-javaagent集:
export JAVA_OPTS="-Xmx1024M -Xms1024M -server -javaagent:/software/apache-tomcat-6.0.36/lib/spring-instrument-3.2.1.RELEASE.jar"
为什么在使用WAR文件编译源代码时这会起作用,但是当它作为JAR文件包含在类路径中时,它根本不起作用。
重新加载WAR上下文文件时,我在tomcat日志文件中多次看到以下内容:
11:27:51,285 DEBUG GenericTypeResolver:151 - 解决返回类型 [公共静态 org.springframework.beans.factory.aspectj.AnnotationBeanConfigurerAspect org.springframework.beans.factory.aspectj.AnnotationBeanConfigurerAspect.aspectOf()] 使用具体方法参数[{}]。
任何/所有回复都表示赞赏!提前致谢, 格里夫
答案 0 :(得分:0)
愚蠢的错误会耗费时间和金钱。我将aop.xml包含在WAR文件/ META-INF文件夹中,而不是包含的JAR文件中。在JAR文件中移动aop.xml文件修复了问题,呃!