springboot~ EventListener事件監聽的使用
EventListener事件觸發和監聽器可以對程式碼解耦,在一些與業務無關的,通用的操作方法,我們可以把它設計成事件監聽器,像通知,訊息這些模組都可以這樣設計。
事件源
@Getter @Builder(toBuilder = true) public class OrderEvent { private String msg; }
事件處理程式
@Component public class OrderEventListener { @EventListener public void handleOrderEvent(OrderEvent event) { System.out.println("我監聽到了handleOrderEvent釋出的message為:" + event.getMsg()); } }
事件觸發
@Service public class OrderService { @Autowired private ApplicationContext context; public void publishOrder() { context.publishEvent(OrderEvent.builder().msg("建立訂單").build()); } }
直接測試事件處理程式
@RunWith(SpringRunner.class) @SpringBootTest public class SecurityApplicationTests implements ApplicationContextAware { private ApplicationContext context = null; @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { this.context = applicationContext; } @Test public void listener() { context.publishEvent(OrderEvent.builder().msg("測試方法").build()); }
測試業務程式碼
由於@Service也是spring元件 ,所以它裡面的事件處理程式也會被注入,這時直接注入業務物件即可
@Autowired OrderService orderService; @Test public void listenerOrder() { orderService.publishOrder(); }