spring事件机制实例(spring事件机制详解)

技术Spring的事件机制知识点有哪些这篇文章主要讲解了“Spring的事件机制知识点有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Spring的事件机制知识点有哪

本文主要讲解“Spring的事件机制有哪些知识点”。本文的解释简单明了,易学易懂。请大家跟随边肖的思路,一起学习学习《春天的事件机制有哪些知识点》!

00-1010同步事件:在一个线程中,按顺序执行业务,先做一件事再做下一件事。

异步事件:在一个线程中,做一件事的同事可以启动一个新的线程来执行另一件事,这样就可以同时执行两件事。

用一个例子来解释同步事件和异步事件的使用场景。有时,一段完整的代码逻辑可能被分成几个部分。以最常见的注册为例,假设完整的流程为:1。点击注册-2。检查信息共存库-3。发送电子邮件通知-4。把它还给用户。代码写得正确,但不是最好的。缺点如下:

逻辑复杂,业务耦合。我们已经将验证数据共存库和发送电子邮件写入了一个大的业务方法。发邮件可以算是一种相对独立的商业方式。

效率低下,假设2和3分别用1秒,用户点击Register后2秒才能看到响应。

同步事件可以解决上面的第一个问题。我们把email方法分离出来放入事件中执行,这样注册的方法只能做2个操作,完成后再发出一个事件执行3个,可以很好的解决业务耦合的问题。

异步事件可以完美解决以上两个问题。注册方法执行2个操作后,发出一个异步事件,另一个线程执行3个操作。注册方式所在的线程可以直接返回给用户,既实现了业务解耦,又提高了效率。用户可以通过点击注册在1秒后看到响应。

同步事件和异步事件

Spring事件发送和监控涉及三个部分。

事件:表示事件本身。自定义事件需要继承此类,并可用于传输数据。例如,对于上述操作,我们需要将用户的电子邮件地址传递给事件侦听器。

ApplicationEventPublisherAware:事件发送器,通过实现这个接口触发事件。

应用程序侦听器:事件侦听器接口,事件的业务逻辑封装在侦听器中。

接下来,我们使用spring的异步事件机制来模拟上面的注册过程。有两种方式:配置文件和注释。

使用配置文件创建事件:

新建TestEvent:

public class testeventextendsaapplicationevent {

privateTestParamsource

public TestEvent(TestparamSource){ 0

super(来源);

this.source=source

}

}

@数据

publicclassTestParam{

privateStringemail

}新建TestListener:

@组件

publicclass testlistener implessapsapplicationlisteneretestevent {

@覆盖

public votinationapplicationevent(TestEventtestEvent){ 0

TestParam param=(TestParam)testevent . getsource();

System.out.println('.....

始.......");
         System.out.println("发送邮件:"+param.getEmail());
         System.out.println(".......结束.....");
     }
 }

新建 EventPublisher:

@Component
public class TestPublish implements ApplicationEventPublisherAware {

    private static ApplicationEventPublisher applicationEventPublisher;

    @Override
    public void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) {
        TestPublish.applicationEventPublisher = applicationEventPublisher;
    }

    public static void  publishEvent(ApplicationEvent communityArticleEvent) {
        applicationEventPublisher.publishEvent(communityArticleEvent);
    }
}

spring-context.xml中添加:

  <bean id="applicationEventAsyncMulticaster" class="org.springframework.context.event.SimpleApplicationEventMulticaster">
         <property name="taskExecutor">
             <bean class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
                 <property name="corePoolSize" value="5"/>
                 <property name="keepAliveSeconds" value="3000"/>
                 <property name="maxPoolSize" value="50"/>
                 <property name="queueCapacity" value="200"/>
             </bean>
         </property>
     </bean>

注意:如果加<propery name="taskExecutor",则使用异步方式执行,否则为同步方式

使用注解方式创建事件

使用 @Async 需要在配置文件添加一下支持,线程池也是需要配置一下的

<!-- 开启@AspectJ AOP代理 -->
    <aop:aspectj-autoproxy proxy-target-class="true"/>

    <!-- 任务执行器 -->
    <task:executor id="executor" pool-size="10"/>

    <!--开启注解调度支持 @Async -->
    <task:annotation-driven executor="executor" proxy-target-class="true"/>

TestListener中在方法中添加@Async

 @Component
 public class TestListener implements ApplicationListener<TestEvent> {
 
     @Async
     @Override
     public void onApplicationEvent(TestEvent testEvent) {
 
         TestParam param = (TestParam) testEvent.getSource();
         System.out.println(".......开始.......");
         System.out.println("发送邮件:"+param.getEmail());
         System.out.println(".......结束.....");
     }
 }

Listener其实还可以做得更彻底一点,使用注解@EventListener可代替实现ApplicationListener,原理是通过扫描这个注解来创建监听器并自动添加到ApplicationContext中.

新建自定义EventHandler:

 @Component
 public class TestEventHandler {
 
     @Async
     @EventListener
     public void handleTestEvent(TestEvent testEvent) {
 
         TestParam param = (TestParam) testEvent.getSource();
         System.out.println(".......开始.......");
         System.out.println("发送邮件:"+param.getEmail());
         System.out.println(".......结束.....");
     }
 }

测试及控制台的打印就不贴了,这里主要记录一下具体的实现方法.

感谢各位的阅读,以上就是“Spring的事件机制知识点有哪些”的内容了,经过本文的学习后,相信大家对Spring的事件机制知识点有哪些这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!

内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/153084.html

(0)

相关推荐

  • 百度脑图,哪里可以系统学习思维导图

    技术百度脑图,哪里可以系统学习思维导图想要系统性的学习,那么只要看这篇文章就够了百度脑图。全文3820字,阅读预计需要花费10分钟。建议拉到文末先点一个“大拇指”收藏,或者评论也可以。回头有时间了慢慢看,一定会收益匪浅,

    生活 2021年10月30日
  • socket和serversocket区别(说明socket通信有哪些种类)

    技术Socket与ServerSocket类构造方法有哪些这篇文章主要介绍“Socket与ServerSocket类构造方法有哪些”,在日常操作中,相信很多人在Socket与ServerSocket类构造方法有哪些问题上

    攻略 2021年12月16日
  • PostgreSQL中函数StartTransaction的实现逻辑是什么

    技术PostgreSQL中函数StartTransaction的实现逻辑是什么这篇文章主要讲解了“PostgreSQL中函数StartTransaction的实现逻辑是什么”,文中的讲解内容简单清晰,易于学习与理解,下面

    攻略 2021年11月10日
  • spark 性能调优高级篇(查询sparksql最新分区)

    技术怎么解析SparkSQL+SequoiaDB 性能调优策略这篇文章将为大家详细讲解有关怎么解析SparkSQL+SequoiaDB 性能调优策略,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后

    攻略 2021年12月17日
  • C++11:std::tuple

    技术C++11:std::tuple C++11:std::tuple翻译来自:https://thispointer.com/c11-stdtuple-tutorial-examples/
    在本文中,

    礼包 2021年11月23日
  • Python中数据结构list怎么用

    技术Python中数据结构list怎么用这篇文章给大家分享的是有关Python中数据结构list怎么用的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。list是一种有序可重复的集合,可以随时添加

    攻略 2021年11月24日