|
|
|
@ -19,7 +19,7 @@
|
|
|
|
|
public class TransactionProxyFactoryBean extends AbstractSingletonProxyFactoryBean
|
|
|
|
|
implements BeanFactoryAware {
|
|
|
|
|
|
|
|
|
|
/** 事务拦截器,通过AOP来发挥作用,spring在此拦截器中封装了 事务处理实现 */
|
|
|
|
|
/** 事务拦截器,通过 AOP 来发挥作用,Spring 在此拦截器中封装了事务处理实现 */
|
|
|
|
|
private final TransactionInterceptor transactionInterceptor = new TransactionInterceptor();
|
|
|
|
|
|
|
|
|
|
/** 切面 */
|
|
|
|
@ -36,7 +36,7 @@ public class TransactionProxyFactoryBean extends AbstractSingletonProxyFactoryBe
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 创建 AOP 对事务处理的 advisor
|
|
|
|
|
* 本方法在IoC容器完成Bean的依赖注入时,通过initializeBean方法被调用
|
|
|
|
|
* 本方法在 IoC容器 完成 Bean的依赖注入时,通过 initializeBean()方法 被调用
|
|
|
|
|
*/
|
|
|
|
|
@Override
|
|
|
|
|
protected Object createMainInterceptor() {
|
|
|
|
@ -46,7 +46,7 @@ public class TransactionProxyFactoryBean extends AbstractSingletonProxyFactoryBe
|
|
|
|
|
return new DefaultPointcutAdvisor(this.pointcut, this.transactionInterceptor);
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
// 如果没定义,则使用spring默认的切面,使用TransactionAttributeSourceAdvisor
|
|
|
|
|
// 如果没定义,则使用 Spring默认的切面,使用 TransactionAttributeSourceAdvisor
|
|
|
|
|
// 作为通知器,并配置拦截器
|
|
|
|
|
return new TransactionAttributeSourceAdvisor(this.transactionInterceptor);
|
|
|
|
|
}
|
|
|
|
@ -154,7 +154,7 @@ public abstract class AbstractSingletonProxyFactoryBean extends ProxyConfig
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
```
|
|
|
|
|
DefaultAopProxyFactory创建AOP Proxy的过程在前面分析AOP的实现原理时已分析过,这里就不再重复了。可以看到,通过以上的一系列步骤,Spring为实现事务处理而设计的拦截器TransctionInterceptor已经设置到ProxyFactory生成的AOP代理对象中去了,这里的TransactionInterceptor是作为AOP Advice的拦截器来实现它的功能的。在IoC容器中,配置其他与事务处理有关的属性,比如,比较熟悉的transactionManager和事务处理的属性,也同样会被设置到已经定义好的TransactionInterceptor中去。这些属性配置在TransactionInterceptor对事务方法进行拦截时会起作用。在AOP配置完成以后,可以看到,在Spring声明式事务处理实现中的一些重要的类已经悄然登场,比如TransactionAttributeSourceAdvisor和TransactionInterceptor,正是这些类通过AOP封装了Spring对事务处理的基本实现。
|
|
|
|
|
DefaultAopProxyFactory 创建 AOP Proxy 的过程在前面分析 AOP的实现原理 时已分析过,这里就不再重复了。可以看到,通过以上的一系列步骤,Spring 为实现事务处理而设计的 拦截器TransctionInterceptor 已经设置到 ProxyFactory 生成的 AOP代理对象 中去了,这里的 TransactionInterceptor 是作为 AOP Advice 的拦截器来实现它的功能的。在 IoC容器 中,配置其他与事务处理有关的属性,比如,比较熟悉的 transactionManager 和事务处理的属性,也同样会被设置到已经定义好的 TransactionInterceptor 中去。这些属性配置在 TransactionInterceptor,对事务方法进行拦截时会起作用。在 AOP配置 完成以后,可以看到,在 Spring声明式事务处理实现 中的一些重要的类已经悄然登场,比如 TransactionAttributeSourceAdvisor 和 TransactionInterceptor,正是这些类通过 AOP 封装了 Spring 对事务处理的基本实现。
|
|
|
|
|
|
|
|
|
|
### 2.2 事务处理配置的读入
|
|
|
|
|
在 AOP配置 完成的基础上,以 TransactionAttributeSourceAdvisor的实现 为入口,了解具体的事务属性配置是如何读入的。
|
|
|
|
@ -167,7 +167,7 @@ public class TransactionAttributeSourceAdvisor extends AbstractPointcutAdvisor {
|
|
|
|
|
private TransactionInterceptor transactionInterceptor;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 对于切面pointcut,这里使用了一个匿名内部类
|
|
|
|
|
* 对于 切面Pointcut,这里使用了一个匿名内部类
|
|
|
|
|
*/
|
|
|
|
|
private final TransactionAttributeSourcePointcut pointcut = new TransactionAttributeSourcePointcut() {
|
|
|
|
|
/**
|
|
|
|
@ -216,8 +216,8 @@ public class NameMatchTransactionAttributeSource implements TransactionAttribute
|
|
|
|
|
private Map<String, TransactionAttribute> nameMap = new HashMap<String, TransactionAttribute>();
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 将给定属性transactionAttributes解析为名称/属性的map对象。以 方法名称 为键,
|
|
|
|
|
* 字符串属性定义 为值,可通过TransactionAttributeEditor解析为TransactionAttribute实例。
|
|
|
|
|
* 将给定 属性transactionAttributes 解析为 <名称, 属性> 的Map对象。以 方法名称 为 key,
|
|
|
|
|
* 字符串属性定义 为 value,可通过 TransactionAttributeEditor 解析为 TransactionAttribute实例。
|
|
|
|
|
*/
|
|
|
|
|
public void setProperties(Properties transactionAttributes) {
|
|
|
|
|
TransactionAttributeEditor tae = new TransactionAttributeEditor();
|
|
|
|
@ -270,6 +270,7 @@ public class NameMatchTransactionAttributeSource implements TransactionAttribute
|
|
|
|
|
protected boolean isMatch(String methodName, String mappedName) {
|
|
|
|
|
return PatternMatchUtils.simpleMatch(mappedName, methodName);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
```
|
|
|
|
|
通过以上过程可以得到与目标对象调用方法相关的 TransactionAttribute对象,在这个对象中,封装了事务处理的配置。具体来说,在前面的匹配过程中,如果匹配返回的结果是 null,那么说明当前的调用方法不是一个事务方法,不需要纳入 Spring 统一的事务管理中,因为它并没有配置在 TransactionProxyFactoryBean 的事务处理设置中。如果返回的 TransactionAttribute对象 不是 null,那么这个返回的 TransactionAttribute对象 就已经包含了对事务方法的配置信息,对应这个事务方法的具体事务配置也已经读入到 TransactionAttribute对象 中了,为 TransactionInterceptor 做好了对调用的目标方法添加事务处理的准备。
|
|
|
|
|
|
|
|
|
|