spring罕用的事务管理形式有aspectj与基于注解这两种,应用aspectj通过在xml配置文件中指定事务的流传级别,隔离级别,切入点(须要加强的办法),切面等。配置较繁锁但能够做到我的项目不与框架耦合;基于注解只须要在进行事务管理的办法上应用@Transactional,而后在xml文件中注明<tx:annotation-driven/>
就能够开启事务了。当然两种事务开启的入口都是通过<tx:annotation-driven/>
实现的。
上面这里记录下应用@Transactional
注解的形式:tx:annotation-driven
才是Spring事务的驱动,spring会在TxNamespaceHandler
注册相应的parser,而后在AnnotationDrivenBeanDefinitionParser
中对annotation-driven
进行解决,解决后会失去一个名为BeanFactoryTransactionAttributeSourceAdvisor
类型的bean,并会将这个bean注册到到BeanFactory中,其理论为Advisor类型,这也是Spring事务可能通过Aop实现事务的根本原因。
Aop在进行解析的时候,最终会生成一个Adivsor对象,这个Advisor对象中封装了切面织入所须要的所有信息,其中就包含最重要的两个局部就是Pointcut和Adivce属性。这里Pointcut用于判断指标bean是否须要织入以后切面逻辑;Advice则封装了须要织入的切面逻辑。如下是这三个局部的简要关系图:
对于Spring事务,其既然是应用Spring Aop实现的,那么也同样会有这三个成员,Advisor对应BeanFactoryTransactionAttributeSourceAdvisor
类,而Advice对应TransactionInterceptor
类,Pointcut则对应TransactionAttributeSourcePointcut
类,同样这三个类的关系如下:
这三个类的作用别离是:
- BeanFactoryTransactionAttributeSourceAdvisor:封装了实现事务所需的所有属性,包含Pointcut,Advice,TransactionManager以及一些其余的在Transactional注解中申明的属性;
- TransactionAttributeSourcePointcut:用于判断哪些bean须要织入以后的事务逻辑。这里可想而知,其判断的根本逻辑就是判断其办法或类申明上有没有应用@Transactional注解,如果应用了就是须要织入事务逻辑的bean;
- TransactionInterceptor:这个bean实质上是一个Advice,其封装了以后须要织入指标bean的切面逻辑,也就是Spring事务是如果借助于数据库事务来实现对指标办法的盘绕的。
参考的文章:Spring事务用法示例与实现原理