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装备来界说业务传达行为。