竹笋

首页 » 问答 » 常识 » 为什么private方法加了Trans
TUhjnbcbe - 2023/7/3 20:42:00

现在产品期望用户创建和保存逻辑分离:把User实例的创建和保存逻辑拆到两个方法分别进行。然后,把事务的注解

Transactional加在保存数据库的方法上。

执行程序,异常正常抛出事务未回滚

源码解析

debug:前一段是Spring创建Bean的过程。当Bean初始化之后,开始尝试代理操作,这是从如下方法开始处理的:

AbstractAutoProxyCator#postProcessAfterInitialization

publicObjectpostProcessAfterInitialization(

NullableObjectbean,StringbeanName){if(bean!=null){ObjectcacheKey=getCacheKey(bean.getClass(),beanName);if(this.earlyProxyRefences.move(cacheKey)!=bean){turnwrapIfNecessary(bean,beanName,cacheKey);}}turnbean;}

继续debug,直到

AopUtils#canApply

针对切面定义里的条件,确定这个方法是否可被应用创建成代理。有段methodMatcher.matches(method,targetClass)判断这个方法是否符合这样的条件:

publicstaticbooleancanApply(Pointcutpc,Class?targetClass,booleanhasIntroductions){//...for(Class?clazz:classes){Method[]methods=ReflectionUtils.getAllDecladMethods(clazz);for(Methodmethod:methods){if(introductionAwaMethodMatcher!=null?introductionAwaMethodMatcher.matches(method,targetClass,hasIntroductions):methodMatcher.matches(method,targetClass)){turntrue;}}}turnfalse;}

从matches()调用到

AbstractFallbackTransactionAttributeSource#getTransactionAttribute

获取注解中的事务属性,根据属性确定事务的策略。接着调用到

1
查看完整版本: 为什么private方法加了Trans