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