事务的三大接口
PlateformTransactionManager 平台事务管理器 ----得到事务状态,提交,回滚事务
TransactionDefinition 事务定义(隔离级别,传播行为,超时,只读,回滚规则)—7大传播行为,4大隔离级别
TransactionStatus 事务运行状态 —新的事物,有保存点吗
@Import(TransactionManagementConfigurationSelector.class) 容器中导入组件TransactionManagementConfigurationSelector
ImportSelector 带有这个字眼,都是往容器中导入组件。----public class TransactionManagementConfigurationSelector extends AdviceModeImportSelector {
BeanFactoryTransactionAttributeSourceAdvisor 增强器的通知。
transactionAttributeSource 事物属性
transactionInterceptor 事务拦截
ImportBeanDefinitionRegistrar注入组件,注入bean
public abstract class AopConfigUtils {}
createBean—》docreateBean—》createBeanInstance---->resolveBeforeInstantiation
AbstractAutowireCapableBeanFactory
try {
// Give BeanPostProcessors a chance to return a proxy instead of the target bean instance.
//给处理器一个机会,去放回一个代理对象----》aop,代理多不会在这里生成代理对象----》因为这里连对象都没有。-----aop的话回去找通知,进行缓存-----》
//不会生成代理对象
Object bean = resolveBeforeInstantiation(beanName, mbdToUse);//从这里拿到接口进行调用BeanPostProcessors
@Nullable
protected Object resolveBeforeInstantiation(String beanName, RootBeanDefinition mbd) {
Object bean = null;
if (!Boolean.FALSE.equals(mbd.beforeInstantiationResolved)) {
// Make sure bean class is actually resolved at this point.
if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {
Class<?> targetType = determineTargetType(beanName, mbd);
if (targetType != null) {
bean = applyBeanPostProcessorsBeforeInstantiation(targetType, beanName);
if (bean != null) {
bean = applyBeanPostProcessorsAfterInitialization(bean, beanName);
}
}
}
mbd.beforeInstantiationResolved = (bean != null);
}
return bean;
}
aop进行了缓存,但事物没有缓存。因为不缓存,那么多的切点,第二次去找,就会很消耗性能。
解析切面,循环每个类,判断它有无切点。事物是直接点名道姓去找。不需要遍历