当前位置: 首页 > news >正文

国外网站做淘宝客/免费推广途径与原因

国外网站做淘宝客,免费推广途径与原因,现在1做啥网站流量大,有哪些做壁纸的网站在Spring Boot应用中,事务是一个非常重要的概念。当应用需要执行一系列的操作,并且这些操作必须在一个事务内执行时,我们就需要使用事务管理。Spring Boot提供了一种非常便捷的方式来处理事务,即使用Transactional注解。但是&…

在Spring Boot应用中,事务是一个非常重要的概念。当应用需要执行一系列的操作,并且这些操作必须在一个事务内执行时,我们就需要使用事务管理。Spring Boot提供了一种非常便捷的方式来处理事务,即使用@Transactional注解。但是,在某些情况下,我们需要在事务完成之后执行一些额外的操作。这时,我们可以使用@TransactionalEventListener注解来监听事务完成事件。

场景

假设我们正在开发一个电商应用。当用户完成订单支付后,我们需要向用户发送一封电子邮件确认邮件。但是,由于发送邮件是一个耗时的操作,我们不希望它阻塞事务。在这种情况下,我们可以将发送电子邮件的操作放在事务完成之后执行。

使用

为了使用@TransactionalEventListener注解,我们需要在方法上添加该注解,并且指定phase属性的值为AFTER_COMMIT。例如:

@TransactionalEventListener(phase = AFTER_COMMIT)
public void handleOrderPaidEvent(OrderPaidEvent event) {// send email
}

当事务完成并且已提交时,该方法将被自动调用。在方法中,我们可以执行任何适当的操作,例如发送电子邮件。

原理

注解定义

首先,我们来看一下@TransactionalEventListener注解的定义。在Spring框架中,该注解定义在org.springframework.transaction.event.TransactionalEventListener包中,具体定义如下:

@Target({ElementType.METHOD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface TransactionalEventListener {@AliasFor("transactionManager")String value() default "";@AliasFor("value")String transactionManager() default "";TransactionPhase phase() default TransactionPhase.AFTER_COMMIT;int order() default Ordered.LOWEST_PRECEDENCE;
}

该注解包含了以下属性:

  • value:用于指定要使用的事务管理器的名称。
  • transactionManager:用于指定要使用的事务管理器的名称。
  • phase:用于指定要在事务的哪个阶段执行监听器。默认值为TransactionPhase.AFTER_COMMIT,即在事务完成并且已提交时执行监听器。
  • order:用于指定监听器的执行顺序。默认值为Ordered.LOWEST_PRECEDENCE,即最低优先级。

代码实现

在Spring框架中,@TransactionalEventListener注解是通过ApplicationListenerMethodAdapter类实现的。该类继承自EventListenerMethodProcessor类,该类负责处理所有的@EventListener注解。

在处理@TransactionalEventListener注解时,ApplicationListenerMethodAdapter类会根据phase属性的值,将监听器注册到相应的TransactionSynchronization对象中。在事务完成时,TransactionSynchronization对象会调用监听器的方法。具体实现可以参考以下代码:

public class ApplicationListenerMethodAdapter extends EventListenerMethodProcessorimplements SmartInitializingSingleton, BeanFactoryAware {private final TransactionSynchronizationManager synchronizationManager;private final TransactionListenerFactory transactionListenerFactory;public ApplicationListenerMethodAdapter(BeanFactory beanFactory, TransactionSynchronizationManager synchronizationManager,TransactionListenerFactory transactionListenerFactory) {super(beanFactory);this.synchronizationManager = synchronizationManager;this.transactionListenerFactory = transactionListenerFactory;}@Overridepublic void onApplicationEvent(ApplicationEvent event) {if (event instanceof TransactionPhaseAware) {TransactionPhase phase = ((TransactionPhaseAware) event).getTransactionPhase();if (phase == TransactionPhase.AFTER_COMMIT) {processTransactionPhaseAwareEvent(event);}} else {super.onApplicationEvent(event);}}private void processTransactionPhaseAwareEvent(ApplicationEvent event) {Object[] listenerBeans = getListenerBeans(event);for (Object listenerBean : listenerBeans) {Collection<TransactionSynchronization> synchronizations =this.synchronizationManager.getSynchronizationsForTransaction();for (TransactionSynchronization synchronization : synchronizations) {TransactionListener listener = this.transactionListenerFactory.createTransactionListener(listenerBean);synchronization.registerSynchronization(listener);}}}// ...
}

在上面的代码中,processTransactionPhaseAwareEvent方法用于处理@TransactionalEventListener注解。首先,该方法会获取所有的监听器,并将它们包装成TransactionListener对象。然后,该方法会获取当前事务中的所有TransactionSynchronization对象,将TransactionListener对象注册到这些TransactionSynchronization对象中。最终,当事务完成时,TransactionSynchronization对象会调用TransactionListener对象的方法。

下面是TransactionListener对象的定义:

public interface TransactionListener extends TransactionSynchronization {Object getTarget();Method getMethod();}

TransactionListener接口继承自TransactionSynchronization接口,该接口定义了在事务完成时要执行的方法。另外,TransactionListener接口还包含了getTarget方法和getMethod方法,用于获取要执行的方法所在的目标对象和方法本身。

ApplicationListenerMethodAdapter类中,TransactionListener对象是通过TransactionListenerFactory对象创建的。TransactionListenerFactory接口定义如下:

public interface TransactionListenerFactory {TransactionListener createTransactionListener(Object bean);}

createTransactionListener方法用于创建TransactionListener对象。在Spring框架中,DefaultTransactionListenerFactory类实现了TransactionListenerFactory接口,并提供了默认的实现。在默认的实现中,DefaultTransactionListenerFactory类会将目标对象和要执行的方法包装成一个InvocableHandlerMethod对象,并将其作为TransactionListener对象返回。

注意

在使用@TransactionalEventListener注解时,需要注意以下几点:

  • 监听器方法必须是非私有的,并且不能是抽象的、静态的或final的。
  • 监听器方法不能抛出任何未捕获的异常。如果监听器方法抛出了异常,那么事务将会回滚。
  • 如果监听器方法中需要进行数据库操作,那么需要在方法上添加@Transactional注解,以便Spring框架能够为该方法开启事务。

结论

​ 通过对Spring框架源码的分析,我们了解到了@TransactionalEventListener注解的实现原理。在Spring框架中,该注解是通过TransactionSynchronization对象实现的,可以在事务完成时执行一些额外的操作。使用@TransactionalEventListener注解需要注意一些细节,比如监听器方法不能抛出未捕获的异常,并且可能需要使用@Transactional注解来开启事务。

​ 总之,@TransactionalEventListener注解是一个非常实用的注解,在处理事务相关的操作时特别方便。通过在方法上添加该注解,我们可以在事务完成时执行一些额外的操作,比如发送消息、更新缓存等。同时,Spring框架提供了丰富的支持,可以让我们更加灵活地使用该注解。例如,我们可以使用Condition来控制何时调用该监听器方法,还可以使用@Order注解来控制多个监听器的执行顺序。

​ 在实际开发中,我们经常需要处理一些复杂的事务场景,例如事务的嵌套、分布式事务等。在这些场景下,@TransactionalEventListener注解同样可以发挥出其优势。通过在方法上添加该注解,我们可以更加方便地处理事务相关的逻辑,同时也可以减少代码的复杂度。

​ 在使用@TransactionalEventListener注解时,我们需要注意一些细节。例如,监听器方法不能抛出未捕获的异常,否则事务将会回滚。此外,如果监听器方法中需要进行数据库操作,那么需要在方法上添加@Transactional注解。这些细节都需要我们在实际开发中多加注意。

​ 综上所述,@TransactionalEventListener注解是一个非常实用的注解,在处理事务相关的操作时特别方便。通过在方法上添加该注解,我们可以在事务完成时执行一些额外的操作,从而提高应用程序的可靠性和健壮性。

http://www.lbrq.cn/news/960931.html

相关文章:

  • 宿迁做网站优化/电商怎么注册开店
  • wordpress页面内导航/湖南正规关键词优化首选
  • 在线图片制作生成/seo网络推广优化
  • 深圳网站备案拍照点/许昌seo推广
  • 网站引导页怎么设置/seo资源
  • 计算机培训班要学多久/沈阳企业网站seo公司
  • 图跃网站建设/网站建设的重要性
  • 东莞 网站 建设/5g影讯5g天线在线观看免费视频
  • 什么是网络营销的方法/百度seo规则
  • 网站seo做点提升流量/公司运营策划营销
  • 如何建设企业网站/网页查询
  • 阿里云个人不能开网站/南昌seo实用技巧
  • 彩票推广网站如何做/今日热搜榜官网
  • 大连企业做网站/seo网络营销招聘
  • wordpress 常数函数/站长工具seo查询5g5g
  • 做讲课ppt的网站/推广网站怎么制作
  • 网站推广引流软件/网站快照优化公司
  • wordpress 站外链接/百度免费推广
  • 嘉兴市建设官方网站/广州网页推广公司
  • 网站前端是做啥的/手机网站排名优化软件
  • 兰州网站优化哪家好/网站流量来源
  • o2o网站咋建设/网站推广的营销策划方案
  • 制定网站建设方案/seo 工具
  • 网站优化工作室/网站宣传文案
  • 官方门户网站j建设的必要性/广告公司名字
  • 网站建立供应商/网络营销推广的方法
  • pos机网站模板/太原做网络推广的公司
  • 富士康/百度刷排名seo
  • 求国外做任务赚钱的网站/网络营销公司名字
  • 如何安装wordpress的插件安装/郑州谷歌优化外包
  • 本地大模型部署工具全解析:LM Studio vs. Ollama 及最佳实践指南
  • 【运维】flash attention安装出现错误及编译慢
  • Spring Cloud Gateway与Envoy Sidecar在微服务请求路由中的架构设计分享
  • LVS 集群技术实践:NAT 与 DR 模式的配置与对比
  • 操作系统-处理机调度和死锁进程同步
  • 在 Jenkins 中使用 SSH 部署密钥