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)

相关推荐

  • 手打虾滑,现在比较有特色的火锅有哪些

    技术手打虾滑,现在比较有特色的火锅有哪些如今的火锅店是越来越多,品种也越来越多了,想吃火锅了,再也不单单是在铜锅涮肉和川味火锅中选择了,日本的寿喜锅,韩国的部队火锅,潮汕牛肉火锅,港式小火锅,梭边鱼火锅,贵州的酸汤鱼火锅

    生活 2021年10月30日
  • python模块之logging模块

    技术python模块之logging模块 python模块之logging模块logging日志模块
    日志模块的内容很多 但需要掌握的很少(会用即可) # 个人观点import logging# 日志

    礼包 2021年11月30日
  • 深圳前海新区,深圳什么地方经济最发达

    技术深圳前海新区,深圳什么地方经济最发达目前(未算前海)有两个街道算是最发达的 粤海街道约占南山区1/2、全市1/10GDP, 坂田街道约占龙岗区1/2、全市近1/10深圳前海新区, 以上两个街道比上海黄埔区还要小很多,

    生活 2021年10月29日
  • 线程状态代码演示

    技术线程状态代码演示 线程状态代码演示package 线程停止;//检测线程状态public class TestState{ public static void main(String[] a

    礼包 2021年12月15日
  • 怎么搭建Mysql单机实例

    技术怎么搭建Mysql单机实例本篇内容介绍了“怎么搭建Mysql单机实例”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1

    攻略 2021年11月21日
  • 关于stm2cumx生成的串口通信USART的使用,2)

    技术关于stm2cumx生成的串口通信USART的使用,2) 关于stm2cumx生成的串口通信USART的使用(2)上面一篇文章讲到在stm32cumx开启串口中断后,系统每接收一个字符就会进入中断一

    礼包 2021年11月29日