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

我的事务管理器配置如下

<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中指定方面名称(在这种情况下为AnnotationTransactionAspect),Spring也会知道那
在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()”的类型
  com.temp.request.service.ServiceImpl(ServiceImpl.java:5)建议
  周围的建议
  'org.springframework.transaction.aspectj.AnnotationTransactionAspect'


因此,这行代码证明AnnotationTransactionAspect在ServiceImpl类中成功编织

我的基本问题是:

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

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

aop.xml对成功完成AnnotationTransactionAspect的加载时间编织是否必要?

最佳答案

Spring内置了对@Transactional注释的支持,
有关更多信息,您可以研究源代码:

https://github.com/spring-projects/spring-framework/blob/master/spring-tx/src/main/java/org/springframework/transaction/annotation/Transactional.java

和文档:

https://github.com/spring-projects/spring-framework/blob/master/spring-tx/src/main/java/org/springframework/transaction/annotation/Transactional.java

08-06 04:51