广告
返回顶部
首页 > 资讯 > 精选 >Spring事务开启原理的示例分析
  • 570
分享到

Spring事务开启原理的示例分析

2023-06-14 07:06:26 570人浏览 安东尼
摘要

这篇文章给大家分享的是有关spring事务开启原理的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。在事务配置类上声明@EnableTransactionManagement注解开启事务在事务配置类上定义数

这篇文章给大家分享的是有关spring事务开启原理的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。

  1. 在事务配置类上声明@EnableTransactionManagement注解开启事务

  2. 在事务配置类上定义数据源

  3. 在事务配置类上定义事务管理器

  4. 在相关类或者方法上使用@Transactional声明事务

代码如下:

@Configuration@EnableTransactionManagementpublic class RootConfig{  @Bean public DataSource dataSource(){  DruidDataSource dataSource = new DruidDataSource();  dataSource.setXXX();  ...    return dataSource; }  @Bean public PlatfromTransactionManager txManager(){  return new DataSourceTransactionManager(dataSource()); }}
@Servicepublic class UserService{ @Autowired private UserRepository userRepository;  @Transactional public void addUser(User user){  userRepository.save(user); }}

@EnableTransactionManagement开启事务原理解析

@EnableTransactionManagement源码如下:

@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)@Documented@Import(TransactionManagementConfigurationSelector.class)public @interface EnableTransactionManagement { boolean proxyTargetClass() default false; AdviceMode mode() default AdviceMode.PROXY; int order() default Ordered.LOWEST_PRECEDENCE;}

可以看到,@EnableTransactionManagement接口类主要Import了TransactionManagementConfigurationSelector来实现其注入,而TransactionManagementConfigurationSelector又主要使用selectImport方法来实现其注入,代码如下:

@Overridepublic final String[] selectImports(AnnotationMetadata importinGClaSSMetadata) { Class<?> annoType = GenericTypeResolver.resolveTypeArgument(getClass(), AdviceModeImportSelector.class); AnnotationAttributes attributes = AnnotationConfigUtils.attributesFor(importingClassMetadata, annoType); if (attributes == null) {  throw new IllegalArgumentException(String.fORMat(   "@%s is not present on importing class '%s' as expected",   annoType.getSimpleName(), importingClassMetadata.getClassName())); } AdviceMode adviceMode = attributes.getEnum(this.getAdviceModeAttributeName()); //根据AdviceMode返回不同的类型,默认是AdviceMode.PROXY。 String[] imports = selectImports(adviceMode); if (imports == null) {  throw new IllegalArgumentException(String.format("Unknown AdviceMode: '%s'", adviceMode)); } return imports;}@Overrideprotected String[] selectImports(AdviceMode adviceMode) { switch (adviceMode) {  case PROXY:   return new String[] {AutoProxyReGIStrar.class.getName(), ProxyTransactionManagementConfiguration.class.getName()};  case ASPECTJ:   return new String[] {TransactionManagementConfigUtils.TRANSACTION_ASPECT_CONFIGURATION_CLASS_NAME};  default:   return null; }}

其中主要功能点为根据AdviceMode选择创建不同的bean,AdviceMode的默认代理方式是PROXY,jdk代理。所以返回的是AutoProxyRegistrar和ProxyTransactionManagementConfiguration。

我们先分析AutoProxyRegistrar,AutoProxyRegistrar实现了ImportBeanDefinitionRegistrar,那在创建bean的时候会调用registerBeanDefinitions方法。registerBeanDefinitions方法的实现:

@Overridepublic void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) { boolean candidateFound = false; Set<String> annoTypes = importingClassMetadata.getAnnotationTypes(); for (String annoType : annoTypes) {  AnnotationAttributes candidate = AnnotationConfigUtils.attributesFor(importingClassMetadata, annoType);  if (candidate == null) {   continue;  }  Object mode = candidate.get("mode");  Object proxyTargetClass = candidate.get("proxyTargetClass");  if (mode != null && proxyTargetClass != null && AdviceMode.class == mode.getClass() &&    Boolean.class == proxyTargetClass.getClass()) {   candidateFound = true;   //只有@EnableTransactionManagement注解才会走到这里   if (mode == AdviceMode.PROXY) {    aopConfigUtils.registerAutoProxyCreatorIfNecessary(registry);    if ((Boolean) proxyTargetClass) {     AopConfigUtils.forceAutoProxyCreatorToUseClassProxying(registry);     return;    }   }  } } //...}public static BeanDefinition registerAutoProxyCreatorIfNecessary(BeanDefinitionRegistry registry, Object source) { return registerOrEScalateApcAsRequired(InfrastructureAdvisorAutoProxyCreator.class, registry, source);}

可以看到,它通过注册InfrastructureAdvisorAutoProxyCreator来启动Spring Aop。

接下来再看ProxyTransactionManagementConfiguration的作用,代码如下:

@Configurationpublic class ProxyTransactionManagementConfiguration extends AbstractTransactionManagementConfiguration { @Bean(name = TransactionManagementConfigUtils.TRANSACTION_ADVISOR_BEAN_NAME) @Role(BeanDefinition.ROLE_INFRASTRUCTURE) public BeanFactoryTransactionAttributeSourceAdvisor transactionAdvisor() {  BeanFactoryTransactionAttributeSourceAdvisor advisor = new BeanFactoryTransactionAttributeSourceAdvisor();  advisor.setTransactionAttributeSource(transactionAttributeSource());  advisor.setAdvice(transactionInterceptor());  advisor.setOrder(this.enableTx.<Integer>getNumber("order"));  return advisor; } @Bean @Role(BeanDefinition.ROLE_INFRASTRUCTURE) public TransactionAttributeSource transactionAttributeSource() {  return new AnnotationTransactionAttributeSource(); } @Bean @Role(BeanDefinition.ROLE_INFRASTRUCTURE) public TransactionInterceptor transactionInterceptor() {  TransactionInterceptor interceptor = new TransactionInterceptor();  interceptor.setTransactionAttributeSource(transactionAttributeSource());  if (this.txManager != null) {   interceptor.setTransactionManager(this.txManager);  }  return interceptor; }}

ProxyTransactionManagementConfiguration是一个配置文件,注册了三个bean,BeanFactoryTransactionAttributeSourceAdvisor、AnnotationTransactionAttributeSource、TransactionInterceptor,而这三个类分别继承Advisor、Advice和Pointcut。即切面所需组件。

感谢各位的阅读!关于“Spring事务开启原理的示例分析”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

--结束END--

本文标题: Spring事务开启原理的示例分析

本文链接: https://www.lsjlt.com/news/268842.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Spring事务开启原理的示例分析
    这篇文章给大家分享的是有关Spring事务开启原理的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。在事务配置类上声明@EnableTransactionManagement注解开启事务在事务配置类上定义数...
    99+
    2023-06-14
  • Spring事务的开启原理详解
    目录@EnableTransactionManagement开启事务原理解析总结 在事务配置类上声明@EnableTransactionManagement注解开启事务 在事...
    99+
    2022-11-11
  • Spring事务失效的示例分析
    这篇文章给大家分享的是有关Spring事务失效的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。Spring事务最终依赖的数据库的事务,如果用的是mysql的话,执行引擎要是innodb;因为只有innoD...
    99+
    2023-06-29
  • Spring AOP实现原理的示例分析
    这篇文章将为大家详细讲解有关Spring AOP实现原理的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。什么是AOPAOP(Aspect-OrientedProgramming,面向方面编程),可...
    99+
    2023-05-30
    spring aop
  • Spring Boot启动事件和监听器的示例分析
    这篇文章将为大家详细讲解有关Spring Boot启动事件和监听器的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Spring Boot 启动事件顺序1、ApplicationStartingEv...
    99+
    2023-06-17
  • Mysql事务隔离级别原理的示例分析
    这篇文章主要介绍Mysql事务隔离级别原理的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!说说事务的隔离级别吧?老实说,事务隔离级别这个问题,无论是校招还是社招,面试官都爱问...
    99+
    2022-10-18
  • 管理linux开机自启服务的示例分析
    这篇文章将为大家详细讲解有关管理linux开机自启服务的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。 自启动服务非常重要,例如(1)需要手动添加希望自启的服务,如安装svn后没有自动添...
    99+
    2023-06-13
  • Spring事务的原理分析是怎样的
    这期内容当中小编将会给大家带来有关Spring事务的原理分析是怎样的,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。Spring事务的基本原理Spring事务的本质其实就是...
    99+
    2022-10-19
  • Spring中事务传播特性的示例分析
    这篇文章主要介绍Spring中事务传播特性的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!一、使用方式可以采用Transactional,配置propagation即可。打开org.springframewo...
    99+
    2023-06-15
  • Spring事务的用法示例与实现原理
    本篇内容主要讲解“Spring事务的用法示例与实现原理”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Spring事务的用法示例与实现原理”吧!关于事务,简单来说,就是为了保证数据完整性而存在的一...
    99+
    2023-06-16
  • vue中事件机制原理的示例分析
    这篇文章主要介绍了vue中事件机制原理的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。常见的事件机制demo都会包含在这段代码中:&...
    99+
    2022-10-19
  • Spring源码解析之编程式事务的示例分析
    这篇文章主要为大家展示了“Spring源码解析之编程式事务的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Spring源码解析之编程式事务的示例分析”这篇文章吧。一、前言在Spring中...
    99+
    2023-06-15
  • jsonp原理的示例分析
    小编给大家分享一下jsonp原理的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一:跨域问题。二,跨域产生的原因Js是不...
    99+
    2022-10-19
  • AJAX原理的示例分析
    这篇文章将为大家详细讲解有关AJAX原理的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。先上原理图: 背景:   &nbs...
    99+
    2022-10-19
  • Spring中JDK和cglib动态代理原理的示例分析
    这篇文章给大家分享的是有关Spring中JDK和cglib动态代理原理的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。Java代理介绍Java中代理的实现一般分为三种:JDK静态代理、JDK动态代理以及C...
    99+
    2023-06-02
  • redis事务的示例分析
    这篇文章将为大家详细讲解有关redis事务的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一: 事务实战具体到事务是什么,要保证什么。。。这个我想没必要...
    99+
    2022-10-18
  • MySQL事务的示例分析
    这篇文章将为大家详细讲解有关MySQL事务的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。ACID 特性事务处理是一种对必须整批执行的 MySQL 操作的管理机制...
    99+
    2022-10-19
  • Hibernate事务的示例分析
    小编给大家分享一下Hibernate事务的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!Hibernate是JDBC的轻量级封装,本身并不具备事务管理能力...
    99+
    2023-06-17
  • Spring Boot应用开发的示例分析
    这篇文章主要介绍了Spring Boot应用开发的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。Spring Boot是由Pivotal团队提供的全新Spring开发...
    99+
    2023-06-20
  • 前端开发之CSS原理的示例分析
    这篇文章主要为大家展示了“前端开发之CSS原理的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“前端开发之CSS原理的示例分析”这篇文章吧。  一、浏览器...
    99+
    2022-10-19
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作