Mari kita lihat kes mudah
@Configuration public class SelfBusiness { public static void main(String[] args) { AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(SelfBusiness.class); context.getBean(MyService.class).doBusiness(); context.close(); } @Component static class MyService { private static final Logger logger = LoggerFactory.getLogger(MyService.class); @Autowired private ApplicationEventPublisher publisher; public void doBusiness (){ logger.debug("主线业务"); logger.debug("发送短信"); logger.debug("发送邮件"); } }
Jalankan kod di atas dan perhatikan kesannya
Digabungkan dengan. hasil output, logik yang perlu dilaksanakan dalam kod ini ialah selepas pelaksanaan perniagaan talian utama selesai, operasi seperti menghantar mesej teks dan e-mel perlu dilakukan tidak cukup elegan dan tidak cukup mesra dari segi kebolehskalaan perniagaan berikutnya, jika perniagaan barisan utama berikutnya selesai dan operasi audit lain perlu ditambah, logik kod baharu perlu ditambah, yang menggabungkan dengan ketat perniagaan barisan utama dan logik cawangan. ;
Dalam erti kata lain, kami menantikan Kesannya perniagaan barisan utama langsung tidak mengambil berat tentang operasi perniagaan lain, ia hanya perlu melengkapkan logiknya sendiri, yang memerlukan penggunaan acara itu. fungsi pendengar disediakan oleh musim bunga;
Gunakan proses transformasi pendengar acara
Terdapat dua cara utama untuk menggunakan pendengar acara dalam springboot (spring Satu ialah melaksanakan antara muka ApplicationListener, dan satu lagi ialah). untuk menambah anotasi @EventListener ke kelas Seterusnya, kedua-dua kaedah ini akan diterangkan satu persatu; objek) dan mewarisi ApplicationEvent
static class MyEvent extends ApplicationEvent { public MyEvent(Object source) { super(source); } }
2. Auto Tentukan kelas perniagaan untuk melaksanakan antara muka ApplicationListenerJelas sekali, jenis acara yang pendengar di sini mahu listen to ialah MyEvent yang kami takrifkan di atas Dengan cara ini, apabila perniagaan dicetuskan, ia boleh digunakan dalam onApplicationEvent Dapatkan parameter yang diluluskan dan laksanakan operasi perniagaan pemesejan teks (e-mel)@Data static class Params { private String id ; private String name; private String phone; } @Component static class SmsApplicationListener implements ApplicationListener<MyEvent> { private static final Logger logger = LoggerFactory.getLogger(SmsApplicationListener.class); @Override public void onApplicationEvent(MyEvent myEvent) { Object source = myEvent.getSource(); try { Params params = objectMapper.readValue(source.toString(), Params.class); logger.debug("userId : {}",params.getId()); } catch (JsonProcessingException e) { e.printStackTrace(); } logger.debug("执行 sms 发短信业务"); } } @Component static class EmailApplicationListener implements ApplicationListener<MyEvent> { private static final Logger logger = LoggerFactory.getLogger(SmsApplicationListener.class); @Override public void onApplicationEvent(MyEvent myEvent) { Object source = myEvent.getSource(); logger.debug("执行 email 发邮件业务"); } }Salin selepas log masuk
3. . Acara penerbitan perniagaan talian utamaUntuk perniagaan talian utama, ini Kemudian anda tidak perlu lagi menulis logik untuk menghantar mesej teks atau e-mel Anda hanya memerlukan penerbit untuk menerbitkan acara tersebut lulus parameter, hantar bersama-sama@Component static class MyService { private static final Logger logger = LoggerFactory.getLogger(MyService.class); @Autowired private ApplicationEventPublisher publisher; public void doBusiness (){ Params params = new Params(); params.setId("001"); params.setName("xiaoma"); params.setPhone("133******"); logger.debug("主线业务"); try { publisher.publishEvent(new MyEvent(objectMapper.writeValueAsString(params))); } catch (JsonProcessingException e) { e.printStackTrace(); } //publisher.publishEvent(new MyEvent("MyService doBusiness()")); //logger.debug("发送短信"); //logger.debug("发送邮件"); } }Salin selepas log masuk
Kod lengkap2 Laksanakannya dengan menambahkan anotasi @EventListenerJalankan semula kod di atas dan perhatikan kesannya. Anda dapat melihat bahawa ia masih boleh memenuhi kesan yang diharapkan@Configuration public class SelfBusiness { private static ObjectMapper objectMapper = new ObjectMapper(); public static void main(String[] args) { AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(SelfBusiness.class); context.getBean(MyService.class).doBusiness(); context.close(); } @Data static class Params { private String id ; private String name; private String phone; } /** * 自定义事件对象 */ static class MyEvent extends ApplicationEvent { public MyEvent(Object source) { super(source); } } @Component static class MyService { private static final Logger logger = LoggerFactory.getLogger(MyService.class); @Autowired private ApplicationEventPublisher publisher; public void doBusiness (){ Params params = new Params(); params.setId("001"); params.setName("xiaoma"); params.setPhone("133******"); logger.debug("主线业务"); try { publisher.publishEvent(new MyEvent(objectMapper.writeValueAsString(params))); } catch (JsonProcessingException e) { e.printStackTrace(); } //publisher.publishEvent(new MyEvent("MyService doBusiness()")); //logger.debug("发送短信"); //logger.debug("发送邮件"); } } /** * 监听事件触发后要执行的业务 */ @Component static class SmsApplicationListener implements ApplicationListener{ private static final Logger logger = LoggerFactory.getLogger(SmsApplicationListener.class); @Override public void onApplicationEvent(MyEvent myEvent) { Object source = myEvent.getSource(); try { Params params = objectMapper.readValue(source.toString(), Params.class); logger.debug("userId : {}",params.getId()); } catch (JsonProcessingException e) { e.printStackTrace(); } logger.debug("执行 sms 发短信业务"); } } @Component static class EmailApplicationListener implements ApplicationListener { private static final Logger logger = LoggerFactory.getLogger(SmsApplicationListener.class); @Override public void onApplicationEvent(MyEvent myEvent) { Object source = myEvent.getSource(); logger.debug("执行 email 发邮件业务"); } } } Salin selepas log masuk
Kaedah ini tidak lagi perlu melaksanakan antara muka ApplicationListener, tetapi hanya menambah anotasi @EventListener terus ke kaedah kelas mendengar. Ia agak dipermudahkan. Kod lengkap disiarkan terus di bawah
package com.congge.config; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import lombok.Data; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationEvent; import org.springframework.context.ApplicationEventPublisher; import org.springframework.context.ApplicationListener; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.context.annotation.Configuration; import org.springframework.context.event.EventListener; import org.springframework.stereotype.Component; @Configuration public class SelfBusiness2 { private static ObjectMapper objectMapper = new ObjectMapper(); public static void main(String[] args) { AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(SelfBusiness2.class); context.getBean(MyService.class).doBusiness(); context.close(); } @Data static class Params { private String id ; private String name; private String phone; } /** * 自定义事件对象 */ static class MyEvent extends ApplicationEvent { public MyEvent(Object source) { super(source); } } @Component static class MyService { private static final Logger logger = LoggerFactory.getLogger(MyService.class); @Autowired private ApplicationEventPublisher publisher; public void doBusiness (){ Params params = new Params(); params.setId("001"); params.setName("xiaoma"); params.setPhone("133******"); logger.debug("主线业务"); try { publisher.publishEvent(new MyEvent(objectMapper.writeValueAsString(params))); } catch (JsonProcessingException e) { e.printStackTrace(); } } } @Component static class SmsListenerService { private static final Logger logger = LoggerFactory.getLogger(SmsListenerService.class); @EventListener public void smsListener(MyEvent myEvent){ Object source = myEvent.getSource(); try { SelfBusiness2.Params params = objectMapper.readValue(source.toString(), SelfBusiness2.Params.class); logger.debug("userId : {}",params.getId()); } catch (JsonProcessingException e) { e.printStackTrace(); } logger.debug("执行 sms 发短信业务"); } } @Component static class EmailListenerService { private static final Logger logger = LoggerFactory.getLogger(EmailListenerService.class); @EventListener public void emailListener(MyEvent myEvent){ Object source = myEvent.getSource(); try { SelfBusiness2.Params params = objectMapper.readValue(source.toString(), SelfBusiness2.Params.class); logger.debug("userId : {}",params.getId()); } catch (JsonProcessingException e) { e.printStackTrace(); } logger.debug("执行 email 发邮件业务"); } } }
Ketiga, gunakan asynchronous
Tambahan pula, untuk meningkatkan kecekapan pelaksanaan logik perniagaan barisan utama , kami berharap logik perniagaan acara penerbitan akan dilaksanakan secara tidak segerak, bagaimana untuk melakukannya
Atas ialah kandungan terperinci Cara menggunakan pendengar acara springboot. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!