【问题标题】:Understanding of Load-time weaving with AspectJ in the Spring Framework for application deployed on TomcatTomcat上部署应用的Spring框架中使用AspectJ进行Load-time weaving的理解
【发布时间】:2019-09-13 09:36:30
【问题描述】:

我在春季使用 aspcetj 模式在 Tomcat 服务器上使用 Load-time weaving 进行事务管理,但我发现很难从概念上理解它。

我的事务管理器配置如下

<bean id="transactionManagerRW" class="org.springframework.orm.jpa.JpaTransactionManager">
        <property name="entityManagerFactory" ref="entityManagerFactoryReadWrite" />
    </bean>
<tx:annotation-driven  mode="aspectj" transaction-manager="transactionManagerRW"/>

为了让加载时间编织工作,我在我的代码中添加了以下依赖项

compile (
        'org.aspectj:aspectjrt:1.8.4',
        'org.aspectj:aspectjweaver:1.8.4',
        'org.springframework:spring-aspects:5.0.0.RELEASE',
)

我的服务类如下

package com.temp.request.service
class ServiceImpl {

        @Transactional
        public CreateRequest CreateRequest (){
           // some business logic here
        } 

          @Transactional
        public void deleteRequests(){
           // some business logic here
        }   

   } 

context.xml如下

 <Context path="/">
        <Loader loaderClass="org.springframework.instrument.classloading.tomcat.TomcatInstrumentableClassLoader"/>
    </Context> 

和aop.xml如下

<aspectj>
    <weaver options="-verbose -showWeaveInfo">
         <include within="com.temp.request.service..*"/>
    </weaver>   
</aspectj>

根据 spring 的文档 AnnotationTransactionAspect 在加载时编织期间创建并编织到目标对象(在本例中为 ServiceImpl 类的对象),但是即使我没有在 aop.xml spring 中指定方面名称(在本例中为 AnnotationTransactionAspect)知道了 在 AnnotationTransactionAspect 期间需要编织到我的 ServiceImpl 类中吗?

在春季教程中,他们在此链接中的 aop.xml 中指定了 ProfilingAspect https://docs.spring.io/spring/docs/3.0.0.M3/reference/html/ch08s08.html 如下

<aspectj>

    <weaver>

        <!-- only weave classes in our application-specific packages -->
        <include within="foo.*"/>

    </weaver>

    <aspects>

        <!-- weave in just this aspect -->        
        <aspect name="foo.ProfilingAspect"/>

    </aspects>

  </aspectj>

在 spring 文档中它被指定为:(https://docs.spring.io/spring/docs/3.0.0.M4/spring-framework-reference/html/ch10s05.html)

用 @Transactional 注释,然后 你链接(编织)你的应用程序 与 org.springframework.transaction.aspectj.AnnotationTransactionAspect 在 spring-aspects.jar 文件中定义。 方面也必须是 配置了事务管理器。你当然可以使用 Spring Framework 的 IoC 容器来处理依赖注入 方面。配置事务管理的最简单方法 方面是使用元素并指定 模式属性到 asepctj

此处以粗体突出显示的行表示您将应用程序与 org.springframework.transaction.aspectj.AnnotationTransactionAspect 链接(编织) 编辑:在部署应用程序期间,我可以在控制台上看到以下行

weaveinfo 连接点 '方法执行(com.temp.request.service.CreateRequest com.temp.request.service.ServiceImpl ()' in Type 'com.temp.request.service.ServiceImpl' (ServiceImpl.java:5) 建议 周围的建议 'org.springframework.transaction.aspectj.AnnotationTransactionAspect'

所以这一行证明AnnotationTransactionAspect在ServiceImpl类中编织成功

我的基本问题是:

如何将我的应用程序与 spring 的 AnnotationTransactionAspect 链接(编织)?

Spring 是如何知道它需要在 ServiceImpl 类中编织 AnnotationTransactionAspect 的?

是否需要 aop.xml 才能成功编织 AnnotationTransactionAspect 的加载时间?

【问题讨论】:

  • 你的服务中有注解@Transcational,所以它是这样知道的。
  • Oooh - Gradle、Spring XML 配置甚至 JavaEE XML 配置的组合。这是非常非常古老(不,过时)和相当新的非常波西米亚风格的组合。迷人的
  • @KrzysztofCichocki 那么 aop.xml 的 ht 用途是什么?从 aop.xml spring 知道它应该在哪些类中编织 AnnotationTransactionAspect。
  • 您可以找到有关@Transactional here 的更多信息。在这种情况下,切面来自spring-aspects

标签: java spring tomcat aspectj load-time-weaving


【解决方案1】:

【讨论】:

  • 我的问题是 spring 如何猜测包含 Transactinal 注释的类方法的位置(包名)?是不是因为aop.xml?
  • 我不确定,如果它在您的情况下从 aop.xml 加载它,我没有这方面的经验。尝试重命名此文件或将其注释掉,然后检查它是否会得到解决,这应该可以回答您的问题。
  • @PawanPatil 你的问题毫无意义。您可以配置 load 时间编织 - 无需猜测。当类加载器加载一个类时,它会被检查,如果有必要的话。
  • 你说当类加载器加载类时会检查它是否意味着每个类都检查了类路径上可用的编织?
  • @PawanPatil 是的。每一堂课。这就是为什么在aop.xml 中配置过滤器是有帮助的——可以更快地做出决定。虽然,所有 XML 处理也不是免费的......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-03
  • 2011-06-18
  • 2012-11-11
相关资源
最近更新 更多