Springboot框架中事情监听和颁布机制详解 (springernature)
事情监听和颁布是SpringFramework中的一种机制,用于成功松懈耦合的组件之间的通讯。上方是事情监听和颁布的具体环节:
事情颁布的环节:
事情监听的环节:
SpringFramework中的ApplicationEventPublisher接口用于颁布和订阅运行程序事情。事情是一种机制,用于在运行程序中成功松懈耦合的组件通讯。当某些事情出现时,颁布者可以通知一切已注册的监听器,并执行相应的操作。上方是ApplicationEventPublisher的具体用法说明和示例代码:
创立自定义事情类:
首先,须要创立一个自定义事情类,承袭自ApplicationEvent。这个事情类将蕴含宿愿在运行程序中颁布的事情的信息。
importorg.springframework.context.ApplicationEvent;publicclassMyCustomEventextendsApplicationEvent{privateStringmessage;publicMyCustomEvent(Objectsource,Stringmessage){super(source);this.message=message;}publicStringgetMessage(){returnmessage;}}
创立事情颁布者:
事情颁布者通常是Spring容器中的一个Bean,它经常使用ApplicationEventPublisher来颁布事情。可以注入ApplicationEventPublisher接口以在须要时颁布事情。
importorg.springframework.context.ApplicationEventPublisher;importorg.springframework.stereotype.Component;@ComponentpublicclassMyEventPublisher{privatefinalApplicationEventPublishereventPublisher;publicMyEventPublisher(ApplicationEventPublishereventPublisher){this.eventPublisher=eventPublisher;}publicvoidpublishCustomEvent(Stringmessage){MyCustomEventcustomEvent=newMyCustomEvent(this,message);eventPublisher.publishEvent(customEvent);}}
创立事情监听器:
事情监听器担任处置事情。可以创立一个或多个事情监听器,每个监听器可以处置不同类型的事情。
importorg.springframework.context.ApplicationListener;importorg.springframework.stereotype.Component;@ComponentpublicclassMyEventListenerimplementsApplicationListener<MyCustomEvent>{@OverridepublicvoidonApplicationEvent(MyCustomEventevent){Stringmessage=event.getMessage();//处置事情System.out.println("Receivedcustomeventwithmessage:"+message);}}
经常使用事情颁布者颁布事情:
在须要颁布事情的中央,可以调用事情颁布者的方法来触发事情。
importorg.springframework.boot.SpringApplication;importorg.springframework.boot.autoconfigure.SpringBootApplication;importorg.springframework.context.ConfigurableApplicationContext;@SpringBootApplicationpublicclassMyApplication{publicstaticvoidmn(String[]args){ConfigurableApplicationContextcontext=SpringApplication.run(MyApplication.class,args);MyEventPublishereventPublisher=context.getBean(MyEventPublisher.class);eventPublisher.publishCustomEvent("Hello,SpringBootEvents!");}}
当运转MyApplication时,事情颁布者将颁布一个自定义事情,而后事情监听器将收到事情并执行相应的操作。
也可以创立同步和异步事情监听器,以便在事情出现时执行不同的操作。同步监听器会在事情颁布线程中间接执行,而异步监听器则会将事情处置委托给另一个线程池,以成功并发处置。上方是同步和异步事情监听的示例说明:
同步事情监听器示例:
importorg.springframework.context.ApplicationListener;importorg.springframework.stereotype.Component;@ComponentpublicclassMySyncEventListenerimplementsApplicationListener<MyCustomEvent>{@OverridepublicvoidonApplicationEvent(MyCustomEventevent){Stringmessage=event.getMessage();//模拟一个长期间运转的操作try{Thread.sleep(2000);//模拟2秒的处置期间}catch(InterruptedExceptione){e.printStackTrace();}System.out.println("SynchronousEventListener-Receivedcustomeventwithmessage:"+message);}}
在这个示例中,MySyncEventListener是一个同步事情监听器。它在onApplicationEvent()方法中执行了一个模拟的长期间运转的操作(2秒)。
异步事情监听器示例:
要创立异步事情监听器,须要经常使用@Async注解来标志监听器方法,而后性能一个TaskExecutorbean,以便Spring可以在异步线程池中执行监听器方法。以下是一个示例:
importorg.springframework.context.ApplicationListener;importorg.springframework.scheduling.annotation.Async;importorg.springframework.stereotype.Component;@ComponentpublicclassMyAsyncEventListenerimplementsApplicationListener<MyCustomEvent>{@Async@OverridepublicvoidonApplicationEvent(MyCustomEventevent){Stringmessage=event.getMessage();//模拟一个长期间运转的操作try{Thread.sleep(2000);//模拟2秒的处置期间}catch(InterruptedExceptione){e.printStackTrace();}System.out.println("AsynchronousEventListener-Receivedcustomeventwithmessage:"+message);}}
在这个示例中,MyAsyncEventListener是一个异步事情监听器。它的onApplicationEvent()方法被标志为@Async,并且在方法内模拟了一个长期间运转的操作。
性能异步事情监听:
要性能异步事情监听器,须要执行以下步骤:
在SpringBoot运行程序的主类上经常使用@EnableAsync注解以启用异步支持。
importorg.springframework.boot.SpringApplication;importorg.springframework.boot.autoconfigure.SpringBootApplication;importorg.springframework.scheduling.annotation.EnableAsync;@SpringBootApplication@EnableAsyncpublicclassMyApplication{publicstaticvoidmain(String[]args){SpringApplication.run(MyApplication.class,args);}}
在性能类或主类中定义一个TaskExecutorbean,以性能异步线程池。
importorg.springframework.context.annotation.Bean;importorg.springframework.core.task.TaskExecutor;importorg.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;@BeanpublicTaskExecutortaskExecutor(){ThreadPoolTaskExecutorexecutor=newThreadPoolTaskExecutor();executor.setCorePoolSize(5);//设置外围线程数executor.setMaxPoolSize(10);//设置最大线程数executor.setQueueCapacity(25);//设置队列容量executor.setThreadNamePrefix("MyAsyncThread-");executor.initialize();returnexecutor;}
经过以上性能,MyAsyncEventListener将会在异步线程中处置事情,而不会阻塞主线程。
请留意,异步监听器的性能或者因运行程序的需求而有所不同。咱们可以依据须要调整线程池的大小和其余参数。
示例中完整代码,可以从上方网址失掉:
springboot框架原理及流程
Spring Boot框架原理及流程Spring Boot是一个开源的Java应用框架,它旨在简化Spring应用的初始搭建以及开发过程。 Spring Boot通过提供默认配置和一系列快捷特性,让开发人员能够更快速地构建出生产级别的Spring应用。 其核心原理主要基于“约定优于配置”的设计理念,通过自动配置和起步依赖来简化开发流程。 在原理上,Spring Boot利用了Spring框架原有的功能,并在此基础上进行了增强和优化。 它提供了一套自动化的配置机制,能够根据项目的依赖关系自动配置Spring应用。 这意味着,开发人员无需手动编写大量的配置代码,Spring Boot会根据项目的结构和添加的依赖自动进行配置。 例如,当项目中添加了Spring Web的依赖时,Spring Boot会自动配置Tomcat作为Web服务器,并设置好相关的Web配置项。 在流程上,使用Spring Boot开发应用通常遵循以下步骤:首先,创建一个Spring Boot项目,可以通过Spring Initializr或IDE的插件来快速生成项目骨架。 然后,在项目中添加所需的依赖,Spring Boot提供了一系列起步依赖,这些依赖包含了开发特定类型应用所需的所有库和配置。 接下来,编写业务代码,由于Spring Boot已经自动配置好了大部分基础设施,开发人员可以专注于业务逻辑的实现。 最后,通过运行Spring Boot的主类来启动应用,Spring Boot会自动检测应用的配置和组件,并启动内置的Web服务器来提供服务。 举个例子,假设我们要开发一个Web应用,使用Spring Boot可以大大简化开发流程。 我们只需要创建一个Spring Boot项目,添加Spring Web的起步依赖,然后编写控制器和业务逻辑代码。 Spring Boot会自动配置Tomcat服务器和相关的Web配置项,我们只需要运行应用的主类,就可以通过浏览器访问Web服务了。 这种简化的开发流程大大提高了开发效率,减少了出错的可能性,让开发人员能够更专注于业务功能的实现。
springboot有哪些优点
Spring boot的优点有简化配置、自动化配置、独立运行、快速构建项目、提供运行时的应用监控等。
1、简化配置
Spring boot通过预定义的配置和自动配置简化配置过程,使开发人员能够简化配置工作。
2、自动化配置
Spring boot可以自动化配置,以此解决整合框架或者技术配置文件过多地问题,并且可以集合所有约定的默认配置。通过自动配置,Spring boot可以自动生成配置文件,并且可以方便地配置bean,避免了手动编写繁琐的配置代码。
3、独立运行
Spring boot具有独立运行的优点。Spring boot可以利用自带的依赖项对源代码进行编译和部署;此外独立于其他开发环境,Spring boot可以独立运行于其他开发环境,避免了其他开发者的依赖问题。
4、快速构建项目
Spring boot是一个快速构建项目的工具,它提供无配置的集成和开发环境,无需外部依赖;它还提供了应用监控和调试功能,极大地提高了开发效率。
5、提供运行时的应用监控
Spring boot提供了运行时的应用监控,使开发人员可以方便地监控应用程序的运行情况,并在出现问题时及时进行诊断和修复。这对于项目中的关键应用和高风险场景尤为重要。
免责声明:本文转载或采集自网络,版权归原作者所有。本网站刊发此文旨在传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及版权、内容等问题,请联系本网,我们将在第一时间删除。同时,本网站不对所刊发内容的准确性、真实性、完整性、及时性、原创性等进行保证,请读者仅作参考,并请自行核实相关内容。对于因使用或依赖本文内容所产生的任何直接或间接损失,本网站不承担任何责任。