boolean execute = statement.execute(“INSERT INTO student (id,student_name) VALUES (‘1’,‘1’)”);
“得到结果”
ResultSet rs = ps.executeQuery();
“忽略关闭数据库 操作…”
}
}
这就是我们普通连接数据库并且执行的语句;这样如果在保存成功之后 发生了错误.那么 数据已经持久化在数据库中了 这时候就会比较麻烦 我们怎么办?
Connection conn = DriverManager.getConnection(…);
conn.setAutoCommit(false);
“执行sql”
“手动提交”
conn.commit();
Spring Transactional 就是帮我们做了这么一件事情;
我们把JdbcTemplate 交给Spring管理;
接下来我们开始进入今天的主题
=========================================================================
在我们的方法中 我们只要加入了@Transactional 注解 代表着我们已经对这个方法里面执行的所有sql开启了事务;
为什么我会在AOP 讲解之后讲 Spring Transactional; 因为它就是基于Spring AOP来实现的;
Spring 开启事务 本质上就是 增加了一个Advisor 一个Advisor 是由一个Advice 和一个 Pointcut构成的.
这个在之前AOP的时候 很明确的表明了这个观点;
@EnableTransactionManagement 原理
===========================================================================================
它的作用主要是向Spring容器中添加了两个Bean:
-
AutoProxyRegistrar
-
ProxyTransactionManagementConfiguration
AutoProxyRegistrar:主要的作用是向Spring容器中注册了一个 InfrastructureAdvisorAutoProxyCreator的Bean。 而InfrastructureAdvisorAutoProxyCreator 继承了AbstractAdvisorAutoProxyCreator,所以这个类的主要作用就是开启自动代理的作用,也 就是一个BeanPostProcessor,会在初始化后步骤中去寻找Advisor类型的Bean,并判断当前某个 Bean是否有匹配的Advisor,是否需要利用动态代理产生一个代理对象。
ProxyTransactionManagementConfiguration 主要作用是定义了三个Bean :
1.BeanFactoryTransactionAttributeSourceAdvisor; 看结尾就很容易看出来 是一个Advisor;
2.AnnotationTransactionAttributeSource:相当于 上面那个Advisor中的Pointcut
3.TransactionInterceptor:相当于BeanFactoryTransactionAttributeSourceAdvisor中的 Advice
记忆顺序 1,2,3 木头人
(一)EnableTransactionManagement 注册 (二)AutoProxyRegistrar 和 (二)ProxyTransactionManagementConfiguration
(二)AutoProxyRegistrar 注册 (木头人)InfrastructureAdvisorAutoProxyCreator 去开启自动代理 找Advisor类型的Bean.
(二)ProxyTransactionManagementConfiguration 生成
BeanFactoryTransactionAttributeSourceAdvisor ----Advisor
AnnotationTransactionAttributeSource —Pointcut
TransactionInterceptor ----Advice
一个注解注册两个bean 一个Bean又创建三个对象 还有一个木头人去找Advisor类型的Bean. 三个对象分别为Advisor Pointcut Advice; Pointcut 去判断 类上 或者方法上是否有@Transactional注解 Advice 在寻找到该切点的时候 执行里面的invoke()方法;
当我们的Bean 在初始化过后;就会进过 (木头人) InfrastructureAdvisorAutoProxyCreator 木头人给判断它是否有@Transactional注解.如果有就生成动态代理;
当我们执行代理对象的被代理方法的时候. 就会调用TransactionInterceptor的invoke()方法;
他们两者 都需要经过 BeanFactoryTransactionAttributeSourceAdvisor 进行匹配判断;.
这样 三个对象都解释清楚了
最后
本人也收藏了一份Java面试核心知识点来应付面试,借着这次机会可以送给我的读者朋友们
目录:
Java面试核心知识点
一共有30个专题,足够读者朋友们应付面试啦,也节省朋友们去到处搜刮资料自己整理的时间!
Java面试核心知识点
已经有读者朋友靠着这一份Java面试知识点指导拿到不错的offer了
朋友们应付面试啦,也节省朋友们去到处搜刮资料自己整理的时间!**
[外链图片转存中…(img-l1AgNoKW-1719175640378)]
Java面试核心知识点
已经有读者朋友靠着这一份Java面试知识点指导拿到不错的offer了
[外链图片转存中…(img-iB9elP7n-1719175640379)]