本文主要讲解“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