之前分析了Aop的逻辑,主要还是我们自己编写的切面类的运行逻辑。一想到aop,应该会想到事务,那么事务是怎么实现的呢?本篇分析下事务的逻辑。
使用
使用这里就不做例子了,直接找例子就可以了,就是@EnableTransactionManagement,@Transactional 两个注解,之前咱们已经看过解析配置类的逻辑了,@EnableTransactionManagement一定有@import注解,看看逻辑。
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import(TransactionManagementConfigurationSelector.class)
public @interface EnableTransactionManagement {
进入到TransactionManagementConfigurationSelector类,实现了ImportSelector接口,那么selectImport方法返回的类一定要重新走一遍解析import类的逻辑,找到真正要导入的类。
TransactionManagementConfigurationSelector#selectImports
默认是AdviceMode 是PROXY,所以将AutoProxyRegistrar,ProxyTransactionManagementConfiguration这两个类作为配置类进行解析,之后注册进工厂中。
protected String[] selectImports(AdviceMode adviceMode) {
switch (adviceMode) {
case PROXY:
return new String[] {AutoProxyRegistrar.class.getName(),
ProxyTransactionManagementConfiguration.class.getName()};
case ASPECTJ:
return new String[] {determineTransactionAspectClass()};
default:
return null;
}
}
单独分析这两个类的逻辑,还是拆出来作为新的一篇文章吧,要不篇幅又多了。
spring事务-AutoProxyRegistrar类
spring事务-ProxyTransactionManagementConfiguration类
AutoProxyRegistrar类是找适合对象的切面。
ProxyTransactionManagementConfiguration类是创切面类。
如果把上面两篇文件看懂,基本上事务的切面逻辑就很清楚了,但是有一点,是怎么创建事务,回滚事务,提交事务的呢?看这篇吧。。