我在春季使用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