新聞中心
當(dāng)把一個(gè)事件發(fā)布到Spring提供的ApplicationContext中,被監(jiān)聽器偵測到,就會執(zhí)行對應(yīng)的處理方法。
永福ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場景,ssl證書未來市場廣闊!成為創(chuàng)新互聯(lián)建站的ssl證書銷售渠道,可以享受市場價(jià)格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:18980820575(備注:SSL證書合作)期待與您的合作!
事件本身
事件是一個(gè)自定義的類,需要繼承Spring提供的ApplicationEvent
。
@Data public class MyEvent extends ApplicationEvent { private String msg; public MyEvent(Object source, String msg) { super(source); this.msg = msg; } }
事件監(jiān)聽
基本方法是實(shí)現(xiàn)ApplicationListener
接口,自定義一個(gè)監(jiān)聽器,實(shí)現(xiàn)onApplicationEvent()
方法,然后添加到ApplicationContext
。
比如:
public class MyListener implements ApplicationListener{ @Override public void onApplicationEvent(MyEvent event) { System.out.print("監(jiān)聽到MyEvent事件"); } } ... // SpringBoot的啟動類中添加監(jiān)聽器 public static void main(String[] args) { SpringApplication application = new SpringApplication(MyApplication.class); application.addListeners(new MyListener()); application.run(args); }
也可以使用注解@EventListener
(推薦):原理就是通過掃描這個(gè)注解,創(chuàng)建監(jiān)聽器并添加到ApplicationContext
。
@Component @Slf4j public class MyEventHandler { @EventListener public void handleEvent(MyEvent event) { log.info("------------處理事件:{}", event.getMsg()); try { Thread.sleep(5 * 1000L); log.info("事件1(5s)處理完成"); } catch (InterruptedException e) { e.printStackTrace(); } } }
事件發(fā)布
可以通過上下文對象的發(fā)布方法ConfigurableApplicationContext::publishEvent()
來發(fā)布。
也可以實(shí)現(xiàn)ApplicationEventPublisherAware
接口來發(fā)布(推薦)。
@Component @Slf4j public class EventService implements ApplicationEventPublisherAware { public ApplicationEventPublisher publisher; @Override public void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) { this.publisher = applicationEventPublisher; } public String doEventWork(String msg) { log.info("------------publish event:" + msg); MyEvent event = new MyEvent(this, msg); publisher.publishEvent(event); return "OK"; } }
測試代碼
@SpringBootTest @RunWith(SpringRunner.class) public class EventServiceTest { @Autowired private EventService service; @Test public void eventTest() { String msg="Java Code"; service.doEventWork(msg); } }
注意
如果2個(gè)事件之間是繼承關(guān)系,會先監(jiān)聽到子類事件,處理完再監(jiān)聽父類。
// MyEvent2 extends MyEvent @Component @Slf4j public class MyEventHandler { @EventListener public void handleEvent(MyEvent event) { log.info("------------處理事件:{}", event.getMsg()); try { Thread.sleep(5 * 1000L); log.info("事件1(5s)處理完成"); } catch (InterruptedException e) { e.printStackTrace(); } } @EventListener public void handleEvent2(MyEvent2 event) { log.info("------------處理事件2:{}", event.getMsg()); try { Thread.sleep(10 * 1000L); log.info("事件2(10s)處理完成"); } catch (InterruptedException e) { e.printStackTrace(); } } }
當(dāng)我publish一個(gè)子類事件MyEvent2時(shí),日志如下:
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持創(chuàng)新互聯(lián)。
名稱欄目:使用Spring事件機(jī)制實(shí)現(xiàn)異步的方法
當(dāng)前鏈接:http://www.dlmjj.cn/article/ijjecs.html