EventListener事件觸發和監聽器能夠對代碼解耦,在一些與業務無關的,通用的操做方法,咱們能夠把它設計成事件監聽器,像通知,消息這些模塊均可以這樣設計。spring
@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組件 ,因此它裏面的事件處理程序也會被注入,這時直接注入業務對象便可app
@Autowired OrderService orderService; @Test public void listenerOrder() { orderService.publishOrder(); }