深入SpringBoot源码(九)SpringApplication与Environment绑定的前置工作(下)

本文介绍了Spring框架中的SimpleApplicationEventMulticaster类,如何构造、配置任务执行器与错误处理,以及如何处理监听器的实例化和多播过程。特别关注了线程安全和异常处理策略。

接着上章所讲的EventPublishingRunListener的构造方法:
在这里插入图片描述
SimpleApplicationEventMulticaster是ApplicationEventMulticaster接口的简单实现。它将所有事件多播到所有注册的监听器,让监听器忽略他们不感​​兴趣的事件。监听器通常会对传入的事件对象执行相应的instanceof检查。默认情况下,所有监听器监听器都在调用线程中调用,这会增加恶意监听器阻塞整个应用程序的危险性。所以最好指定一个替代任务执行器,让监听器在不同的线程中执行,例如从线程池中执行。

public class SimpleApplicationEventMulticaster extends AbstractApplicationEventMulticaster {
   
   

	@Nullable
	private Executor taskExecutor;

	@Nullable
	private ErrorHandler errorHandler;

	@Nullable
	private volatile Log lazyLogger;


	/**
	 * 创建一个新的 SimpleApplicationEventMulticaster。

	 */
	public SimpleApplicationEventMulticaster() {
   
   
	}

	/**
	 * 为给定的 BeanFactory 创建一个新的 SimpleApplicationEventMulticaster。
	 */
	public SimpleApplicationEventMulticaster(BeanFactory beanFactory) {
   
   
		setBeanFactory(beanFactory);
	}


	/**
	 * 设置一个自定义执行器(通常是org.springframework.core.task.TaskExecutor )来调用每个监听器。
	 * 默认相当于org.springframework.core.task.SyncTaskExecutor ,在调用线程中同步执行所有监听器。
	 * 考虑在此处指定一个异步任务执行器,以在所有监听器都已执行之前不阻塞调用者。但是,请注意,异步执行不会参与调用者的线程上下文(类加载器、事务关联),除非 TaskExecutor 明确支持这一点。
	 */
	public void setTaskExecutor(@Nullable Executor taskExecutor) {
   
   
		this.taskExecutor = taskExecutor;
	}

	/**
	 * 返回此多播器的当前任务执行器。
	 */
	@Nullable
	protected Executor getTaskExecutor() {
   
   
		return this.taskExecutor;
	}

	/**
	 * 设置ErrorHandler以在侦听器抛出异常时调用。默认值为无,侦听器异常会停止当前多播并传播到当前事件的发布者。
	 * 如果指定了任务执行器,则每个单独的侦听器异常都会传播到执行器,但不一定会停止其他侦听器的执行。
	 * 考虑设置一个捕获和记录异常的ErrorHandler实现(例如org.springframework.scheduling.support.TaskUtils.LOG_AND_SUPPRESS_ERROR_HANDLER )或一个在传播异常的同时记录异常的实现(例如org.springframework.scheduling.support.TaskUtils.LOG_AND_PROPAGATE_ERROR_HANDLER )。
	 */
	public void setErrorHandler(@Nullable ErrorHandler errorHandler) {
   
   
		this.errorHandler = errorHandler;
	}

	/**
	 * 返回此多播器的当前错误处理程序。
	 */
	@Nullable
	protected ErrorHandler getErrorHandler() {
   
   
		return this.errorHandler;
	}

	@Override
	public void multicastEvent(ApplicationEvent event) {
   
   
		multicastEvent(event, resolveDefaultEventType(event));
	}

	@Override
	public void multicastEvent(final ApplicationEvent event,
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值