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();
}