修缮之前的博文
This commit is contained in:
parent
289fa63ab4
commit
dd753a604b
@ -27,7 +27,7 @@
|
|||||||
- [SpringMVC 的设计与实现](/docs/Spring/SpringMVC/SpringMVC的设计与实现.md)
|
- [SpringMVC 的设计与实现](/docs/Spring/SpringMVC/SpringMVC的设计与实现.md)
|
||||||
- [SpringMVC 跨域解析](/docs/Spring/SpringMVC/SpringMVC-CROS.md)
|
- [SpringMVC 跨域解析](/docs/Spring/SpringMVC/SpringMVC-CROS.md)
|
||||||
### SpringJDBC
|
### SpringJDBC
|
||||||
努力编写中...
|
- 努力编写中...
|
||||||
|
|
||||||
### Spring事务
|
### Spring事务
|
||||||
- [Spring 与事务处理](/docs/Spring/SpringTransaction/Spring与事务处理.md)
|
- [Spring 与事务处理](/docs/Spring/SpringTransaction/Spring与事务处理.md)
|
||||||
@ -87,13 +87,13 @@
|
|||||||
- [把被说烂的 BIO、NIO、AIO 再从头到尾扯一遍](docs/Netty/IO/把被说烂的BIO、NIO、AIO再从头到尾扯一遍.md)
|
- [把被说烂的 BIO、NIO、AIO 再从头到尾扯一遍](docs/Netty/IO/把被说烂的BIO、NIO、AIO再从头到尾扯一遍.md)
|
||||||
|
|
||||||
### 设计原理
|
### 设计原理
|
||||||
努力编写中...
|
- 努力编写中...
|
||||||
|
|
||||||
## Redis
|
## Redis
|
||||||
努力编写中...
|
- 努力编写中...
|
||||||
|
|
||||||
## Tomcat
|
## Tomcat
|
||||||
努力编写中...
|
- 努力编写中...
|
||||||
|
|
||||||
## 学习心得
|
## 学习心得
|
||||||
### 个人经验
|
### 个人经验
|
||||||
|
@ -10,9 +10,9 @@ Spring事务处理模块的类层次结构如下图所示。
|
|||||||
|
|
||||||
从上图可以看到,Spring事务处理模块 是通过 AOP功能 来实现声明式事务处理的,比如事务属性的配置和读取,事务对象的抽象等。因此,在 Spring事务处理 中,可以通过设计一个 TransactionProxyFactoryBean 来使用 AOP功能,通过这个 TransactionProxyFactoryBean 可以生成 Proxy代理对象,在这个代理对象中,通过 TransactionInterceptor 来完成对代理方法的拦截,正是这些 AOP 的拦截功能,将事务处理的功能编织进来。
|
从上图可以看到,Spring事务处理模块 是通过 AOP功能 来实现声明式事务处理的,比如事务属性的配置和读取,事务对象的抽象等。因此,在 Spring事务处理 中,可以通过设计一个 TransactionProxyFactoryBean 来使用 AOP功能,通过这个 TransactionProxyFactoryBean 可以生成 Proxy代理对象,在这个代理对象中,通过 TransactionInterceptor 来完成对代理方法的拦截,正是这些 AOP 的拦截功能,将事务处理的功能编织进来。
|
||||||
|
|
||||||
对于具体的事务处理实现,比如事务的生成、提交、回滚、挂起等,由于不同的底层数据库有不同的支持方式,因此,在Spring事务处理中,对主要的事务实现做了一个抽象和适配。适配的具体事务处理器包括:对DataSource数据源的事务处理支持,对Hibernate数据源的事务处理支持,对JDO数据源的事务处理支持,对JPA和JTA等数据源的事务处理支持等。这一系列的事务处理支持,都是通过设计PlatformTransactionManager、AbstractPlatforTransactionManager以及一系列具体事务处理器来实现的,而PlatformTransactionManager又实现了TransactionInterceptor接口,通过这样一个接口实现设计,就把这一系列的事务处理的实现与前面提到的TransactionProxyFactoryBean结合起来,从而形成了一个Spring声明式事务处理的设计体系。
|
对于具体的事务处理实现,比如事务的生成、提交、回滚、挂起等,由于不同的底层数据库有不同的支持方式,因此,在 Spring事务处理中,对主要的事务实现做了一个抽象和适配。适配的具体事务处理器包括:对 DataSource数据源 的事务处理支持,对 Hibernate数据源 的事务处理支持,对 JDO数据源 的事务处理支持,对 JPA 和 JTA 等数据源的事务处理支持等。这一系列的事务处理支持,都是通过设计 PlatformTransactionManager、AbstractPlatformTransactionManager 以及一系列具体事务处理器来实现的,而 PlatformTransactionManager 又实现了 TransactionInterceptor接口,通过这样一个接口实现设计,就把这一系列的事务处理的实现与前面提到的 TransactionProxyFactoryBean 结合起来,从而形成了一个 Spring声明式事务处理 的设计体系。
|
||||||
|
|
||||||
## 2 Spring事务处理 的应用场景
|
## 2 Spring事务处理 的应用场景
|
||||||
Spring 作为应用平台或框架的设计出发点是支持 POJO的开发,这点在实现事务处理的时候也不例外。在 Spring 中,它既支持编程式事务管理方式,又支持声明式事务处理方式,在使用 Spring 处理事务的时候,声明式事务处理通常比编程式事务管理更方便些。
|
Spring 作为应用平台或框架的设计出发点是支持 POJO的开发,这点在实现事务处理的时候也不例外。在 Spring 中,它既支持编程式事务管理方式,又支持声明式事务处理方式,在使用 Spring 处理事务的时候,声明式事务处理通常比编程式事务管理更方便些。
|
||||||
|
|
||||||
Spring对应用的支持,一方面,通过声明式事务处理,将事务处理的过程和业务代码分离出来。这种声明方式实际上是通过AOP的方式来完成的。显然,Spring已经把那些通用的事务处理过程抽象出来,并通过AOP的方式进行封装,然后用声明式的使用方式交付给客户使用。这样,应用程序可以更简单地管理事务,并且只需要关注事务的处理策略。另一方面,应用在选择数据源时可能会采取不同的方案,当以Spring作为平台时,Spring在应用和具体的数据源之间,搭建一个中间平台,通过这个中间平台,解耦应用和具体数据源之间的绑定,并且,Spring为常用的数据源的事务处理支持提供了一系列的TransactionManager。这些Spring封装好的TransactionManager为应用提供了很大的方便,因为在这些具体事务处理过程中,已经根据底层的实现,封装好了事务处理的设置以及与特定数据源相关的特定事务处理过程,这样应用在使用不同的数据源时,可以做到事务处理的即开即用。这样的另一个好处是,如果应用有其他的数据源事务处理需要,Spring也提供了一种一致的方式。这种有机的事务过程抽象和具体的事务处理相结合的设计,是我们在日常的开发中非常需要模仿学习的。
|
Spring 对应用的支持,一方面,通过声明式事务处理,将事务处理的过程和业务代码分离出来。这种声明方式实际上是通过 AOP 的方式来完成的。显然,Spring 已经把那些通用的事务处理过程抽象出来,并通过 AOP 的方式进行封装,然后用声明式的使用方式交付给客户使用。这样,应用程序可以更简单地管理事务,并且只需要关注事务的处理策略。另一方面,应用在选择数据源时可能会采取不同的方案,当以 Spring 作为平台时,Spring 在应用和具体的数据源之间,搭建一个中间平台,通过这个中间平台,解耦应用和具体数据源之间的绑定,并且,Spring 为常用的数据源的事务处理支持提供了一系列的 TransactionManager。这些 Spring 封装好的 TransactionManager 为应用提供了很大的方便,因为在这些具体事务处理过程中,已经根据底层的实现,封装好了事务处理的设置以及与特定数据源相关的特定事务处理过程,这样应用在使用不同的数据源时,可以做到事务处理的即开即用。这样的另一个好处是,如果应用有其他的数据源事务处理需要, Spring 也提供了一种一致的方式。这种 有机的事务过程抽象 和 具体的事务处理 相结合的设计,是我们在日常的开发中非常需要模仿学习的。事务处理,将事务处理的过程和业务代码分离出来。这种声明方式实际上是通过AOP的方式来完成的。显然,Spring已经把那些通用的事务处理过程抽象出来,并通过AOP的方式进行封装,然后用声明式的使用方式交付给客户使用。这样,应用程序可以更简单地管理事务,并且只需要关注事务的处理策略。另一方面,应用在选择数据源时可能会采取不同的方案,当以Spring作为平台时,Spring在应用和具体的数据源之间,搭建一个中间平台,通过这个中间平台,解耦应用和具体数据源之间的绑定,并且,Spring为常用的数据源的事务处理支持提供了一系列的TransactionManager。这些Spring封装好的TransactionManager为应用提供了很大的方便,因为在这些具体事务处理过程中,已经根据底层的实现,封装好了事务处理的设置以及与特定数据源相关的特定事务处理过程,这样应用在使用不同的数据源时,可以做到事务处理的即开即用。这样的另一个好处是,如果应用有其他的数据源事务处理需要,Spring也提供了一种一致的方式。这种有机的事务过程抽象和具体的事务处理相结合的设计,是我们在日常的开发中非常需要模仿学习的。
|
@ -19,7 +19,7 @@
|
|||||||
public class TransactionProxyFactoryBean extends AbstractSingletonProxyFactoryBean
|
public class TransactionProxyFactoryBean extends AbstractSingletonProxyFactoryBean
|
||||||
implements BeanFactoryAware {
|
implements BeanFactoryAware {
|
||||||
|
|
||||||
/** 事务拦截器,通过AOP来发挥作用,spring在此拦截器中封装了 事务处理实现 */
|
/** 事务拦截器,通过 AOP 来发挥作用,Spring 在此拦截器中封装了事务处理实现 */
|
||||||
private final TransactionInterceptor transactionInterceptor = new TransactionInterceptor();
|
private final TransactionInterceptor transactionInterceptor = new TransactionInterceptor();
|
||||||
|
|
||||||
/** 切面 */
|
/** 切面 */
|
||||||
@ -36,7 +36,7 @@ public class TransactionProxyFactoryBean extends AbstractSingletonProxyFactoryBe
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* 创建 AOP 对事务处理的 advisor
|
* 创建 AOP 对事务处理的 advisor
|
||||||
* 本方法在IoC容器完成Bean的依赖注入时,通过initializeBean方法被调用
|
* 本方法在 IoC容器 完成 Bean的依赖注入时,通过 initializeBean()方法 被调用
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
protected Object createMainInterceptor() {
|
protected Object createMainInterceptor() {
|
||||||
@ -46,7 +46,7 @@ public class TransactionProxyFactoryBean extends AbstractSingletonProxyFactoryBe
|
|||||||
return new DefaultPointcutAdvisor(this.pointcut, this.transactionInterceptor);
|
return new DefaultPointcutAdvisor(this.pointcut, this.transactionInterceptor);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
// 如果没定义,则使用spring默认的切面,使用TransactionAttributeSourceAdvisor
|
// 如果没定义,则使用 Spring默认的切面,使用 TransactionAttributeSourceAdvisor
|
||||||
// 作为通知器,并配置拦截器
|
// 作为通知器,并配置拦截器
|
||||||
return new TransactionAttributeSourceAdvisor(this.transactionInterceptor);
|
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 事务处理配置的读入
|
### 2.2 事务处理配置的读入
|
||||||
在 AOP配置 完成的基础上,以 TransactionAttributeSourceAdvisor的实现 为入口,了解具体的事务属性配置是如何读入的。
|
在 AOP配置 完成的基础上,以 TransactionAttributeSourceAdvisor的实现 为入口,了解具体的事务属性配置是如何读入的。
|
||||||
@ -167,7 +167,7 @@ public class TransactionAttributeSourceAdvisor extends AbstractPointcutAdvisor {
|
|||||||
private TransactionInterceptor transactionInterceptor;
|
private TransactionInterceptor transactionInterceptor;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 对于切面pointcut,这里使用了一个匿名内部类
|
* 对于 切面Pointcut,这里使用了一个匿名内部类
|
||||||
*/
|
*/
|
||||||
private final TransactionAttributeSourcePointcut pointcut = new TransactionAttributeSourcePointcut() {
|
private final TransactionAttributeSourcePointcut pointcut = new TransactionAttributeSourcePointcut() {
|
||||||
/**
|
/**
|
||||||
@ -216,8 +216,8 @@ public class NameMatchTransactionAttributeSource implements TransactionAttribute
|
|||||||
private Map<String, TransactionAttribute> nameMap = new HashMap<String, TransactionAttribute>();
|
private Map<String, TransactionAttribute> nameMap = new HashMap<String, TransactionAttribute>();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 将给定属性transactionAttributes解析为名称/属性的map对象。以 方法名称 为键,
|
* 将给定 属性transactionAttributes 解析为 <名称, 属性> 的Map对象。以 方法名称 为 key,
|
||||||
* 字符串属性定义 为值,可通过TransactionAttributeEditor解析为TransactionAttribute实例。
|
* 字符串属性定义 为 value,可通过 TransactionAttributeEditor 解析为 TransactionAttribute实例。
|
||||||
*/
|
*/
|
||||||
public void setProperties(Properties transactionAttributes) {
|
public void setProperties(Properties transactionAttributes) {
|
||||||
TransactionAttributeEditor tae = new TransactionAttributeEditor();
|
TransactionAttributeEditor tae = new TransactionAttributeEditor();
|
||||||
@ -270,6 +270,7 @@ public class NameMatchTransactionAttributeSource implements TransactionAttribute
|
|||||||
protected boolean isMatch(String methodName, String mappedName) {
|
protected boolean isMatch(String methodName, String mappedName) {
|
||||||
return PatternMatchUtils.simpleMatch(mappedName, methodName);
|
return PatternMatchUtils.simpleMatch(mappedName, methodName);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
```
|
```
|
||||||
通过以上过程可以得到与目标对象调用方法相关的 TransactionAttribute对象,在这个对象中,封装了事务处理的配置。具体来说,在前面的匹配过程中,如果匹配返回的结果是 null,那么说明当前的调用方法不是一个事务方法,不需要纳入 Spring 统一的事务管理中,因为它并没有配置在 TransactionProxyFactoryBean 的事务处理设置中。如果返回的 TransactionAttribute对象 不是 null,那么这个返回的 TransactionAttribute对象 就已经包含了对事务方法的配置信息,对应这个事务方法的具体事务配置也已经读入到 TransactionAttribute对象 中了,为 TransactionInterceptor 做好了对调用的目标方法添加事务处理的准备。
|
通过以上过程可以得到与目标对象调用方法相关的 TransactionAttribute对象,在这个对象中,封装了事务处理的配置。具体来说,在前面的匹配过程中,如果匹配返回的结果是 null,那么说明当前的调用方法不是一个事务方法,不需要纳入 Spring 统一的事务管理中,因为它并没有配置在 TransactionProxyFactoryBean 的事务处理设置中。如果返回的 TransactionAttribute对象 不是 null,那么这个返回的 TransactionAttribute对象 就已经包含了对事务方法的配置信息,对应这个事务方法的具体事务配置也已经读入到 TransactionAttribute对象 中了,为 TransactionInterceptor 做好了对调用的目标方法添加事务处理的准备。
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user