Spring 结构是一个流行的Java应用程序结构,其间业务办理是其最重要的特性之一。业务是指一系列相关操作的调集,假如其间任何一步失败,整个业务应该回滚到之前的状况。

Spring 结构供给了一个丰厚的业务办理功用调集,包含业务传达机制,阻隔等级等。本文将深化了解结构业务办理的底层原理,特别是业务传达机制的完成。

业务概述

业务是指在数据库中履行的一系列相关操作。它们必须作为单个操作单元履行,以确保数据的一致性和完整性。在Java应用程序中,业务能够运用 JDBC 或 Java Persistence API(JPA)进行办理。

Spring 结构支撑声明式和编程式业务办理

  • 在声明式业务办理中,能够运用注释或XML装备声明怎么办理业务。
  • 在编程式业务办理中,能够运用编程办法办理业务。

不管挑选哪种办法, Spring 结构都供给了一致性的API来办理业务。

业务办理

业务办理器首要有三个接口:

  • PlatformTransactionManager: 供给了办理业务的根本操作,如开端业务,提交业务和回滚业务。
  • TransactionDefinition: 供给了业务的界说,如阻隔等级,超时和传达行为。
  • TransactionStatus: 供给了业务的状况,如是否已提交或已回滚。

Spring 结构供给了许多完成 PlatformTransactionManager 接口的类, 其间包含:

  • DataSourceTransactionManager: 用于在JDBC业务中运用。
  • JpaTransactionManager: 用于在JPA业务中运用。
  • HibernateTransactionManager: 用于在Hibernate业务中运用。

能够依据的需求挑选运用哪个业务办理器。

业务传达机制

Spring 结构的业务传达机制用于界说在多个业务之间怎么传达业务。例如,假如一个办法正在一个具有业务的上下文中履行,而该办法又调用另一个办法,那么应该怎么处理业务? Spring 结构的业务传达机制界说了这种情况下的行为:

  • PROPAGATION_REQUIRED: 假如当时存在业务,则参加该业务;不然,创立一个新业务。

  • PROPAGATION_SUPPORTS: 假如当时存在业务,则参加该业务;不然,不运用业务。

  • PROPAGATION_MANDATORY: 假如当时存在业务,则参加该业务;不然,抛出反常。

  • PROPAGATION_REQUIRES_NEW: 创立一个新业务,并挂起当时业务(假如存在)。

  • PROPAGATION_NOT_SUPPORTED: 不运用业务;假如当时存在业务,则挂起该业务。

  • PROPAGATION_NEVER: 不运用业务;假如当时存在业务,则抛出反常。

  • PROPAGATION_NESTED: 假如当时存在业务,则在嵌套业务中履行;不然,创立一个新业务。

业务传达机制的默认值PROPAGATION_REQUIRED。这意味着假如一个办法在一个具有业务的上下文中履行,而该办法又调用另一个办法,则第二个办法将参加该业务。

业务传达机制完成

业务传达机制是经过 TransactionInterceptor 阻拦器来完成的。TransactionInterceptor 是一个AOP阻拦器,它阻拦办法调用,并在办法调用之前和之后发动和提交业务。

当运用 Spring 结构进行业务办理时,需求将 TransactionInterceptor 添加到的应用程序上下文中。然后,能够运用 @Transactional 注释或运用XML装备来界说业务传达行为。

下面是一个运用 @Transactional 注释界说业务传达行为的示例:

@Transactional(propagation = Propagation.REQUIRED)
public void foo() {
// ...
}

在这个比如中,foo() 办法运用默认的业务传达行为 PROPAGATION_REQUIRED。

当运用 @Transactional 注释时, Spring 结构会将 TransactionInterceptor 添加到的办法上。当调用该办法时,TransactionInterceptor 会阻拦该调用,并依据在注释中指定的业务传达行为来发动业务。

结构源码解析

在 Spring 结构中,业务办理器的完成首要包含以下几个类:

  • AbstractPlatformTransactionManager: 它是PlatformTransactionManager接口的笼统完成。它界说了业务的根本操作,如开端业务,提交业务和回滚业务。

  • DataSourceTransactionManager: 它是AbstractPlatformTransactionManager的子类,它用于在JDBC业务中运用。

  • JpaTransactionManager: 它是AbstractPlatformTransactionManager的子类,它用于在JPA业务中运用。

  • HibernateTransactionManager: 它是AbstractPlatformTransactionManager的子类,它用于在Hibernate业务中运用。

业务传达机制的完成首要包含以下几个类:

  • AbstractFallbackTransactionAttributeSource: 它是TransactionAttributeSource接口的笼统完成。它界说了怎么获取业务特点。

  • AnnotationTransactionAttributeSource: 它是AbstractFallbackTransactionAttributeSource的子类,它用于从注释中获取业务特点。

  • TransactionInterceptor: 它是一个AOP阻拦器,它阻拦办法调用,并在办法调用之前和之后发动和提交业务。

业务传达机制的完成首要是经过 TransactionInterceptor 阻拦器来完成的。下面是TransactionInterceptor的源代码:

public class TransactionInterceptor implements MethodInterceptor {
    private PlatformTransactionManager transactionManager;
    private TransactionAttributeSource transactionAttributeSource;
    // ...
    @Override
    public Object invoke(MethodInvocation invocation) throws Throwable {
        TransactionAttributeSource tas = getTransactionAttributeSource();
        if (tas == null) {
            // no transaction attribute source -> no transaction
            return invocation.proceed();
        }
        Class<?> targetClass = (invocation.getThis() != null ? AopUtils.getTargetClass(invocation.getThis()) : null);
        TransactionAttribute txAttr = tas.getTransactionAttribute(invocation.getMethod(), targetClass);
        PlatformTransactionManager tm = determineTransactionManager(txAttr);
        TransactionInfo txInfo = createTransactionIfNecessary(tm, txAttr, invocation.getMethodIdentification());
        Object retVal = null;
        try {
            retVal = invocation.proceed();
        }
        catch (Throwable ex) {
            // transactional code threw exception -> rollback
            completeTransactionAfterThrowing(txInfo, ex);
            throw ex;
        }
        finally {
            cleanupTransactionInfo(txInfo);
        }
        commitTransactionAfterReturning(txInfo);
        return retVal;
    }
    // ...
}

在这个代码中,invoke() 办法阻拦了办法调用,并依据其业务特点来发动业务。

假如业务特点为PROPAGATION_REQUIRED,则创立一个新业务或参加当时业务。

假如业务特点为PROPAGATION_REQUIRES_NEW,则创立一个新业务并挂起当时业务。

假如业务特点为PROPAGATION_SUPPORTS,则将不运用业务。

假如业务特点为PROPAGATION_MANDATORY,则将抛出反常。

总结

Spring 结构的业务办理是其最重要的特性之一。它供给了一个丰厚的业务办理功用调集,包含业务传达机制,阻隔等级等。业务传达机制界说了在多个业务之间怎么传达业务。

业务传达机制是经过TransactionInterceptor阻拦器来完成的,该阻拦器会阻拦办法调用,并依据其业务特点来发动业务。

在运用 Spring 结构进行业务办理时,能够运用@Transactional注释或运用XML装备来界说业务传达行为。