了解在Tomcat上部署的应用程序的Spring框架中使用AspectJ进行加载时编织



我在Tomcat服务器上使用aspcetj模式在spring中使用加载时编织进行事务管理,我发现很难从概念上理解它。

我的事务管理器配置如下

<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是如何知道的是否需要在我的ServiceImpl类中编织AnnotationTransactionAspect?

在spring教程中,他们在aop.xml中的这个链接中指定了ProfileAspecthttps://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>

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

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

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

weaveninfo连接点'方法执行(com.temp.request.service.CreateRequest类型中的com.temp.request.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

最新更新