기본 지원
우선 어떤 기본 이벤트가 지원되는지 살펴보자
프로그램 1(서비스)
우선 살펴보기 프로그램에서
ApplicationEventPublisher는 봄 항목이며 전송을 위해 주입되어야 합니다. ApplicationEventPublisherAware가 구현되어 있기 때문에 setApplicationEventPublisher 메소드가 자동으로 이를 호출하고 브로드캐스트 발신자를 가져옵니다
/** * @author Carl * @date 2016/8/28 * @modify 版权所有.(c)2008-2016.广州市森锐电子科技有限公司 */public class EmailService implements ApplicationEventPublisherAware { private List<String> blackList; private ApplicationEventPublisher publisher; public void setBlackList(List<String> blackList) { this.blackList = blackList; } public void setApplicationEventPublisher(ApplicationEventPublisher publisher) { this.publisher = publisher; } /** * 具体广播类 * @param address * @param text */ public void sendEmail(String address, String text) { if (blackList.contains(address)) { BlackListEvent event = new BlackListEvent(this, address, text); publisher.publishEvent(event); return; } // send email... } }
프로그램 2(이벤트)
여기에서도 ApplicationEvent를 상속해야 하며, 방송을 수신할 때 얻을 수 있도록 필요한 매개변수 등을 직접 구현할 수 있습니다. 또한 소스
/** * @author Carl * @date 2016/8/28 * @modify 版权所有.(c)2008-2016.广州市森锐电子科技有限公司 */public class BlackListEvent extends ApplicationEvent { private String address; private String test; public BlackListEvent(Object source, String address, String test) { super(source); this.address = address; this.test = test; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } public String getTest() { return test; } public void setTest(String test) { this.test = test; } }
프로그램 3(수신기)
스프링을 사용할 때 여전히 해당 사양 세트를 따라야 합니다. 그런 다음 수신기는 ApplicationListener 인터페이스를 구현해야 합니다. 일반 브로드캐스트를 수신하면 onApplicationEvent 인터페이스가 전달됩니다
물론 spring은 매우 사려 깊고 반드시 ApplicationListener 클래스를 구현하지는 않습니다. 주석 @EventListener
/** * @author Carl * @date 2016/8/28 * @modify 版权所有.(c)2008-2016.广州市森锐电子科技有限公司 */public class BlackListNotifier implements ApplicationListener<BlackListEvent> { private String notificationAddress; public void setNotificationAddress(String notificationAddress) { this.notificationAddress = notificationAddress; } @EventListener public void onApplicationEvent(BlackListEvent event) { // notify appropriate parties via notificationAddress... System.out.println("onApplicationEvent, some thing I receive:" + event.getAddress() + ",text:" + event.getTest()); } @EventListener(condition = "#event.test == 'foo'") public void onApplicationCustomerEvent(BlackListEvent event) { System.out.println("onApplicationCustomerEvent,some thing I receive:" + event.getAddress() + ",text:" + event.getTest()); // notify appropriate parties via notificationAddress... } @EventListener({ContextStartedEvent.class, ContextRefreshedEvent.class}) public void handleContextStart() { System.out.println("-------------handleContextStart"); } /** * 参数可以给BlackListEvent 可以不给 */ @EventListener(classes = {BlackListEvent.class}) public void handleBlackListEvent() { System.out.println("-------------handleBlackListEvent"); } }
@EventListener
이 주석을 사용하는 방법을 분석해 보겠습니다. 위 프로그램과 마찬가지로 인터페이스 구현 외에도 조건을 통해 SpEL 표현식을 사용할 수 있습니다. , 조건이 충족되었을 때만 실행됩니다. 이벤트 객체가 트리거될 때 이 클래스가 실행됩니다. 프로그램 4(config bean)여기서는 주로/** * 配置 * @author Carl * @date 2016/8/28 * @modify 版权所有.(c)2008-2016.广州市森锐电子科技有限公司 */@Configurationpublic class AppConfig { @Bean public EmailService emailService() { EmailService s = new EmailService(); List<String> emails = new ArrayList<>(3); emails.add("known.spammer@example.org"); emails.add("known.hacker@example.org"); emails.add("john.doe@example.org"); s.setBlackList(emails); return s; } @Bean public BlackListNotifier notifier() { BlackListNotifier notifier = new BlackListNotifier(); notifier.setNotificationAddress("blacklist@example.org"); return notifier; } }
을 수락하기 위해 일부 서비스를 등록하고 브로드캐스트 Bean을 수락합니다.