我在我的 Tomcat 6 webapp 中让加载时编织与 Spring 一起工作时遇到了一些问题。我只想将它用于事务(以便自调用尊重事务注释,而 AOP 代理不这样做)。似乎正在加载编织器,但实际上并没有编织我的带注释的类。当我单步执行我的代码时,我在 SQL 日志中看不到任何事务边界,正如我在使用常规 AOP 代理配置时看到的那样。这是我的设置:
在 server.xml 中:
<Context path="/api" allowLinking="true" reloadable="false" docBase="/usr/local/apache-tomcat-6.0.18/webapps/API/ROOT" workDir="/usr/local/apache-tomcat-6.0.18/webapps/API/ROOT/work">
<Loader loaderClass="org.springframework.instrument.classloading.tomcat.TomcatInstrumentableClassLoader"/>
</Context>
我有 spring-tomcat-weaver.jar tomcat/lib 目录,以及我的 Tomcat 类路径中的以下 jar:
tomcat/webapps/API/ROOT/WEB-INF/lib/aspectjweaver.jar tomcat/webapps/API/ROOT/WEB-INF/lib/spring-aspects.jar
这是在定义带注释的服务类的 bean 配置文件中:
<tx:annotation-driven transaction-manager="txManager" mode="aspectj"/>
在我的上下文中的许多其他 bean 配置文件之一中:
<aop:aspectj-autoproxy>
<aop:include name="methodTimer"/>
</aop:aspectj-autoproxy>
<context:load-time-weaver aspectj-weaving="on"/>
<context:annotation-config />
<bean name="methodTimer" class="tv.current.web.aop.MethodTimer" />
我希望 MethodTimer 使用常规 AOP 代理,而不是 LTW - LTW 应该只适用于 @Transactional 注释。如此处所述:http: //static.springsource.org/spring/docs/2.5.x/reference/aop.html#aop-aj-configure。如果我注释掉<aop:aspectj-autoproxy>
元素,我不会收到任何我看到的编织信息日志消息。说到这里,他们来了;您可以看到方面正在加载,但实际上没有编织任何内容:
Aug 28, 2009 6:34:42 PM org.apache.catalina.core.ApplicationContext log
INFO: Initializing Spring root WebApplicationContext
[TomcatInstrumentableClassLoader@34fe7e0e] info AspectJ Weaver Version 1.6.5 built on Thursday Jun 18, 2009 at 03:42:32 GMT
[TomcatInstrumentableClassLoader@34fe7e0e] info register classloader org.springframework.instrument.classloading.tomcat.TomcatInstrumentableClassLoader@34fe7e0e
[TomcatInstrumentableClassLoader@34fe7e0e] info using configuration file:/usr/local/apache-tomcat-6.0.18/webapps/API/ROOT/WEB-INF/lib/spring-aspects.jar!/META-INF/aop.xml
[TomcatInstrumentableClassLoader@34fe7e0e] warning ignoring duplicate definition: jar:file:/usr/local/apache-tomcat-6.0.18/webapps/API/ROOT/WEB-INF/lib/spring-aspects.jar!/META-INF/aop.xml
[TomcatInstrumentableClassLoader@34fe7e0e] info register aspect org.springframework.beans.factory.aspectj.AnnotationBeanConfigurerAspect
[TomcatInstrumentableClassLoader@34fe7e0e] info register aspect org.springframework.transaction.aspectj.AnnotationTransactionAspect
[TomcatInstrumentableClassLoader@34fe7e0e] info processing reweavable type org.springframework.beans.factory.aspectj.AbstractInterfaceDrivenDependencyInjectionAspect$ConfigurableDeserializationSupport: org/springframework/beans/factory/aspectj/AbstractInterfaceDrivenDependencyInjectionAspect.aj
[TomcatInstrumentableClassLoader@34fe7e0e] info successfully verified type org.springframework.beans.factory.aspectj.AnnotationBeanConfigurerAspect exists. Originates from org/springframework/beans/factory/aspectj/D:\projects\spring\spring\aspectj\src\org\springframework\beans\factory\aspectj\AnnotationBeanConfigurerAspect.aj
[TomcatInstrumentableClassLoader@34fe7e0e] info successfully verified type org.springframework.beans.factory.aspectj.AbstractInterfaceDrivenDependencyInjectionAspect exists. Originates from org/springframework/beans/factory/aspectj/D:\projects\spring\spring\aspectj\src\org\springframework\beans\factory\aspectj\AbstractInterfaceDrivenDependencyInjectionAspect.aj
[TomcatInstrumentableClassLoader@34fe7e0e] weaveinfo Type 'org.springframework.beans.factory.aspectj.AbstractInterfaceDrivenDependencyInjectionAspect$ConfigurableDeserializationSupport' (AbstractInterfaceDrivenDependencyInjectionAspect.aj) has intertyped method from 'org.springframework.beans.factory.aspectj.AbstractInterfaceDrivenDependencyInjectionAspect' (D:\projects\spring\spring\aspectj\src\org\springframework\beans\factory\aspectj\AbstractInterfaceDrivenDependencyInjectionAspect.aj:'java.lang.Object org.springframework.beans.factory.aspectj.AbstractInterfaceDrivenDependencyInjectionAspect$ConfigurableDeserializationSupport.readResolve()')
从日志可以看出,我没有自己的aop.xml文件,我使用的是spring-aspects.jar中默认的,如下:
<aspectj>
<!--
<weaver options="-showWeaveInfo"/>
-->
<aspects>
<aspect name="org.springframework.beans.factory.aspectj.AnnotationBeanConfigurerAspect"/>
<aspect name="org.springframework.transaction.aspectj.AnnotationTransactionAspect"/>
</aspects>
</aspectj>
我不需要用 启动Tomcat -javaagent:/path/to/spring-agent.jar
,对吗?因为我在 server.xml 中指定了正确的 ClassLoader 并且看到加载器被使用。我错了吗?我在任何地方都需要 spring-agent.jar,无论是在 tomcat/lib 还是我的 tomcat 类路径中?我需要在 tomcat/lib 中的 aspectjweaver.jar 吗?我还缺少什么?任何帮助将不胜感激,因为我已经为此苦苦挣扎了将近两天。
编辑:我省略的另一个(也许非常重要)细节 - 我正在 Eclipse 中开发并使用 Sysdeo Tomcat 插件来启动 Tomcat。将尝试从命令行启动 Tomcat,看看是否有所不同......