SpringBoot-监听器配置原理

SpringBoot-监听器配置原理

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";
    }
}
  • 发布事件的controller
@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()会将我们在扫描文件的时候找到的监听器放到一个集合中,在这个方法中会将这些监听器都注册到我们的监听器控制中心。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值