7

我在我的 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,看看是否有所不同......

4

2 回答 2

6

原来它是我用来启动 Tomcat 的 Eclipse 插件。我们整个团队都变得依赖它,从不从本地机器上的命令行启动 Tomcat。它对破坏 LTW 的类加载器做了一些事情。当我最终从命令行启动 Tomcat 时,一切正常。作为记录,如果您在 server.xml 中指定 TomcatInstrumentableClassLoader,则不需要 -javaagent:path/to/spring-agent.jar。

于 2009-09-08T18:47:03.257 回答
0

Yes, I do believe you need the spring-agent.jar as a javaagent. Also, I don't know if this is the case, but is MethodTimer an aspect, or it's what you are trying to crosscut? If it's an aspect, then it needs the @Aspect annotation.

You may also want to use your own custom META-INF/aop.xml file and specify the

于 2009-09-03T21:45:22.523 回答