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)

相关推荐

  • C++实现WPF动画的具体操作方法

    技术C++实现WPF动画的具体操作方法本篇文章为大家展示了C++实现WPF动画的具体操作方法,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。C++编程语言的应方式非常广泛,可以帮助

    攻略 2021年10月27日
  • 12月22号

    技术12月22号 12月22号在Ashx里面经常是有
    public void ProcessRequest(HttpContext context){context.Response.ContentTy

    礼包 2021年12月23日
  • css中position属性设置(css中position的属性)

    技术css定位position属性怎么使用这篇文章主要介绍“css定位position属性怎么使用”,在日常操作中,相信很多人在css定位position属性怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操

    攻略 2021年12月20日
  • ES6新特性常用的知识点有哪些

    技术ES6新特性常用的知识点有哪些这篇文章主要介绍了ES6新特性常用的知识点有哪些,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1.关键字Let 关键字

    攻略 2021年11月13日
  • 线性回归理解和应用例子

    技术线性回归理解和应用例子 线性回归理解和应用例子HaHa,没错又是作业...
    理解:
    线性回归是利用数理统计中回归分析,来确定两种或两种以上变量间相互依赖的定量关系的一种统计分析方法。
    这句话里的“相

    礼包 2021年11月22日
  • Laravel基于reset怎么实现分布式事务

    技术Laravel基于reset怎么实现分布式事务这篇文章主要讲解了“Laravel基于reset怎么实现分布式事务”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Lara

    攻略 2021年11月9日