现在产品期望用户创建和保存逻辑分离:把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
获取注解中的事务属性,根据属性确定事务的策略。接着调用到