【发布时间】: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。
-
您可以找到有关
@Transactionalhere 的更多信息。在这种情况下,切面来自spring-aspects。
标签: java spring tomcat aspectj load-time-weaving