SpringBoot-监听器的配置
监听器配置有以下的方法
实现ApplicationListener接口并且放入Spring容器中
@Component
public class BeanNameListener implements ApplicationListener < InstanceRegisterEvent> {
@Override
public void onApplicationEvent ( InstanceRegisterEvent e) {
System. out. println ( "BeanName监听到了服务注册" + e. getInstanceInfo ( ) ) ;
}
}
在我们的Bean类的方法加上@EventListener注解
@Component
public class MyListener {
@EventListener
public void test ( InstanceRegisterEvent e) {
System. out. println ( "监听到了服务注册" + e. getInstanceInfo ( ) ) ;
}
}
所发布的事件需要继承ApplicationEvent 接口。
public class InstanceRegisterEvent extends ApplicationEvent {
public InstanceRegisterEvent ( Object source) {
super ( source) ;
}
public String getInstanceInfo ( ) {
return "InstanceRegisterEvent" ;
}
}
@RestController
public class ControllerTest {
@Autowired
ApplicationContext context;
@RequestMapping ( "/publish" )
public String testPublish ( ) {
context. publishEvent ( new InstanceRegisterEvent ( this ) ) ;
return "success" ;
}
}
监听器控制中心
在容器的refresh()函数中的initApplicationEventMulticaster()中会将容器中注入监听器控制中心SimpleApplicationEventMulticaster。 有两种方法注入,一种是从Spring容器中找 ,另一种是自己new 。也就是说如果我们没有往容器中放,那么就会自己new一个控制中心。 在SimpleApplicationEventMulticaster中有两非常重要的域
Executor taskExecutor; 线程池 可以异步处理事件 ErrorHandler errorHandler; 错误处理器 对于事件监听器中事件错可以做相对应的处理。 我可以自己配置SimpleApplicationEventMulticaster 就可以将这两个自定义添加进去。
@Bean ( "applicationEventMulticaster" )
public SimpleApplicationEventMulticaster simpleApplicationEventMulticaster ( BeanFactory beanFactory, ThreadPoolTaskExecutor poolTaskExecutor) {
SimpleApplicationEventMulticaster simpleApplicationEventMulticaster
= new SimpleApplicationEventMulticaster ( beanFactory) ;
simpleApplicationEventMulticaster. setTaskExecutor ( poolTaskExecutor) ;
simpleApplicationEventMulticaster. setErrorHandler ( new ErrorHandler ( ) {
@Override
public void handleError ( Throwable throwable) {
System. out. println ( "这里 有错误了 是:" + throwable) ;
}
} ) ;
return simpleApplicationEventMulticaster;
}
@Bean
public ThreadPoolTaskExecutor poolTaskExecutor ( ) {
ThreadPoolTaskExecutor threadPoolTaskExecutor = new ThreadPoolTaskExecutor ( ) ;
threadPoolTaskExecutor. setMaxPoolSize ( 15 ) ;
threadPoolTaskExecutor. setCorePoolSize ( 10 ) ;
threadPoolTaskExecutor. setQueueCapacity ( 30 ) ;
threadPoolTaskExecutor. setRejectedExecutionHandler ( new ThreadPoolExecutor. AbortPolicy ( ) ) ;
threadPoolTaskExecutor. initialize ( ) ;
return threadPoolTaskExecutor;
}
refresh() 方法中的 registerListeners()会将我们在扫描文件的时候找到的监听器放到一个集合中,在这个方法中会将这些监听器都注册到我们的监听器控制中心。