首页 > 编程语言 >spring-transaction源码分析(4)AspectJ和spring-aspects模块

spring-transaction源码分析(4)AspectJ和spring-aspects模块

时间:2023-05-16 12:12:21浏览次数:60  
标签:transaction -- spring jar aspectj txObject 源码 AspectJ

AspectJ是Java语言实现的一个面向切面编程的扩展库,能够基于一定的语法编写Aspect代码,使用ajc编译器将其编译成.class文件,之后在Java程序编写或加载时将Aspect逻辑嵌入到指定的切面。

安装AspectJ

下载AspectJ

到官网下载安装包:

http://www.eclipse.org/downloads/download.php?file=/tools/aspectj/aspectj-1.9.6.jar

安装AspectJ

java -jar aspectj-1.9.6.jar

示例安装到D:\app\aspectj1.9目录下。

基础示例

目录结构

aspectj1.9
  |-- bin
    |-- ajc
    |-- ajc.bat
  |-- doc
  |-- lib
    |-- aspectjrt.jar
    |-- aspectjtools.jar
    |-- aspectjweaver.jar

官方示例

cd D:\app\aspectj1.9\doc\examples

set CLASSPATH="D:\app\aspectj1.9\lib\aspectjrt.jar"
set Path=D:\app\aspectj1.9\bin;%Path%

ajc -argfile tracing/tracelib.lst -outjar tracelib.jar
ajc -aspectpath tracelib.jar -argfile tracing/notrace.lst -outjar tracedapp.jar

java -classpath "%CLASSPATH%;tracedapp.jar;tracelib.jar" tracing.ExampleMain

spring-aspects模块

AdviceMode.ASPECTJ模式

当EnableTransactionManagement注解的mode属性设置为AdviceMode.ASPECTJ时,将不会再使用spring aop生成事务代理,而是使用AspectJ代理,即装配AnnotationTransactionAspect对象,AnnotationTransactionAspect是一个原生AspectJ组件,该组件使用AspectJ在类加载阶段为目标方法嵌入事务拦截逻辑以实现事务管理。

此时需要:

  1. 添加spring-aspects依赖
  2. 添加-javaagent:path/to/aspectjweaver.jar启动参数

AnnotationTransactionAspect

这个类在spring-aspects模块中。

AnnotationTransactionAspect.aj文件:

public aspect AnnotationTransactionAspect extends AbstractTransactionAspect {

	public AnnotationTransactionAspect() {
		super(new AnnotationTransactionAttributeSource(false));
	}

	private pointcut executionOfAnyPublicMethodInAtTransactionalType() :
		execution(public * ((@Transactional *)+).*(..)) && within(@Transactional *);

	private pointcut executionOfTransactionalMethod() :
		execution(@Transactional * *(..));

	protected pointcut transactionalMethodExecution(Object txObject) :
		(executionOfAnyPublicMethodInAtTransactionalType() || executionOfTransactionalMethod() ) && 
            this(txObject);
}

AbstractTransactionAspect.aj文件:

public abstract aspect AbstractTransactionAspect extends TransactionAspectSupport implements DisposableBean {

	protected AbstractTransactionAspect(TransactionAttributeSource tas) {
		setTransactionAttributeSource(tas);
	}

	@Override
	public void destroy() {
		clearTransactionManagerCache();
	}

	@SuppressAjWarnings("adviceDidNotMatch")
	Object around(final Object txObject): transactionalMethodExecution(txObject) {
		MethodSignature methodSignature = (MethodSignature) thisJoinPoint.getSignature();
		// Adapt to TransactionAspectSupport's invokeWithinTransaction...
		try {
			return invokeWithinTransaction(methodSignature.getMethod(), txObject.getClass(), 
                                           new InvocationCallback() {
				public Object proceedWithInvocation() throws Throwable {
					return proceed(txObject);
				}
			});
		} catch (RuntimeException | Error ex) {
			throw ex;
		} catch (Throwable thr) {
			Rethrower.rethrow(thr);
			throw new IllegalStateException("Should never get here", thr);
		}
	}

	protected abstract pointcut transactionalMethodExecution(Object txObject);
}

这两个类使用aspectj语法声明了事务切入点和环绕通知。

该模块在构建时会使用aspectj的ajc编译器将aj文件编译成class文件。

参考资料

https://www.eclipse.org/aspectj/docs.php

标签:transaction,--,spring,jar,aspectj,txObject,源码,AspectJ
From: https://www.cnblogs.com/xugf/p/17404547.html

相关文章

  • Spring 3 & jBPM 5 & LocalTaskService
    帖子地址:[url]https://community.jboss.org/thread/195386[/url]HiGuys,IamalsostrugglinginconfigSpring+LocalHumanTask.Iamusing[color=red][b]Spring3.0,JBPM5.4.0.Final,Drools5.5.0.Final[/b][/color]IcanconfigtouseJTA......
  • springboot 整合webservice 相关说明
    1.环境依赖jdk8,springboot2.3.12.release,cxf版本需要根据springboot版本修改,方法:查看springboot版本的发布日期,然后根据日期找相近的两个版本<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId><versi......
  • 埃斯顿 伺服驱动器 方案 C源码 埃斯顿 伺服驱动器 方案 C源码 可直 伺服驱动方案
    埃斯顿伺服驱动器方案C源码埃斯顿伺服驱动器方案C源码可直伺服驱动方案源码资料C语言源代码,资料齐全可直接生产!2500线省线式编码器,17位增量编码器,20位绝对值编码器!标配CANopen、高精度运动控制,高速总线通讯,可靠性好,性价比高。资料网上花3千买的,需要的直接联系。埃......
  • 汇川频器md380量产方案,包含原理图,pcb图,矢量源码。 拿来
    汇川频器md380量产方案,包含原理图,pcb图,矢量源码。拿来就用!量产参考,学习提高,必备利器。ID:195612600074192......
  • Spring中实现文件上传
    一些问题:springmvc文件上传,使用它的MultipartHttpServletRequest,tomcat中正常,resion中报错[url]http://zhupan.iteye.com/blog/26427[/url]实现图片上传用户必须能够上传图片,因此需要文件上传的功能。比较常见的文件上传组件有CommonsFileUpload(htt......
  • SpringIOC和SpringAOP
    作为一个Spring使用者条件:拥有深入的Spring框架知识和开发经验,能够熟练地运用Spring框架来构建复杂的应用程序。了解Spring框架的核心概念和设计思想,如控制反转(IoC)、依赖注入(DI)、面向切面编程(AOP)等,并能灵活运用这些概念来解决实际问题。熟悉Spring框架中各个模块的功能和用法,如......
  • SpringMVC快速复习(超详细)
    目录一、SpringMVC简介1、什么是MVC2、什么是SpringMVC3、SpringMVC的特点二、HelloWorld1、开发环境2、创建maven工程a>添加web模块b>打包方式:warc>引入依赖3、配置web.xmla>默认配置方式b>扩展配置方式4、创建请求控制器5、创建springMVC的配置文件6、测试HelloWorlda>实现对首......
  • springboot(8)--定制服务
    springboot的服务配置除了application.properties,还可以通过implements WebServerFactoryCustomizer<T>定制服务,例如指定容器,端口,协议等等我们只要在继承类中添加自己的配置即可*@ClassnameTomcatServerConfiger*@CreatedbyMichael*@Date2023/5/15*@Descriptio......
  • htmlParser源码分析之1---类图
         需要做一个垂直搜索引擎,比较了nekohtml和htmlparser的功能,尽管nekohtml在容错性、性能等方面的口碑好像比htmlparser好(htmlunit也用的是nekohtml),但感觉nekohtml的测试用例和文档都比htmlparser都少,而且htmlparser基本上能够满足垂直搜索引擎页面处理分析的需......
  • 四、SpringCloud Alibaba搭建Nacos集群
    Nacos定义为一个IDC内部应用组件,并非面向公网环境的产品,建议在内部隔离网络环境中部署,强烈不建议部署在公共网络环境。Nacos支持三种部署模式单机模式-用于测试和单机试用。集群模式-用于生产环境,确保高可用。多集群模式-用于多数据中心场景。单机模式下运行NacosLi......