spring boot 1.5.3 源代码片段 - 配置Tomcat(TomcatEmbeddedServletContainerFactory)

机制:

1、在初始化TomcatEmbeddedServletContainerFactory的时候,会被 EmbeddedServletContainerCustomizerBeanPostProcessor#postProcessBeforeInitialization(...) 拦截
2、EmbeddedServletContainerCustomizerBeanPostProcessor 会扫描实现EmbeddedServletContainerCustomizer接口的bean,并调用customize方法,参数为TomcatEmbeddedServletContainerFactory,在此可以配置TomcatEmbeddedServletContainerFactory
public class EmbeddedServletContainerCustomizerBeanPostProcessor
		implements BeanPostProcessor, BeanFactoryAware {

	private ListableBeanFactory beanFactory;

	private List<EmbeddedServletContainerCustomizer> customizers;

	@Override
	public void setBeanFactory(BeanFactory beanFactory) {
		Assert.isInstanceOf(ListableBeanFactory.class, beanFactory,
				"EmbeddedServletContainerCustomizerBeanPostProcessor can only be used "
						+ "with a ListableBeanFactory");
		this.beanFactory = (ListableBeanFactory) beanFactory;
	}

	@Override
	public Object postProcessBeforeInitialization(Object bean, String beanName)
			throws BeansException {
		if (bean instanceof ConfigurableEmbeddedServletContainer) {
			postProcessBeforeInitialization((ConfigurableEmbeddedServletContainer) bean);
		}
		return bean;
	}

	@Override
	public Object postProcessAfterInitialization(Object bean, String beanName)
			throws BeansException {
		return bean;
	}

	private void postProcessBeforeInitialization(
			ConfigurableEmbeddedServletContainer bean) {
		for (EmbeddedServletContainerCustomizer customizer : getCustomizers()) { // !!! 获取实现EmbeddedServletContainerCustomizer接口的bean列表
			/**
			 * 如:调用TomcatEmbeddedServletContainerFactory.addContextCustomizers() 添加自定义配置器
			 * @see org.springframework.boot.autoconfigure.websocket.WebSocketContainerCustomizer#customize(org.springframework.boot.context.embedded.ConfigurableEmbeddedServletContainer)
			 * @see org.springframework.boot.autoconfigure.websocket.TomcatWebSocketContainerCustomizer#doCustomize(org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainerFactory)
			 */
			customizer.customize(bean);
		}
	}

	private Collection<EmbeddedServletContainerCustomizer> getCustomizers() {
		if (this.customizers == null) {
			// Look up does not include the parent context
			this.customizers = new ArrayList<EmbeddedServletContainerCustomizer>(
					this.beanFactory
							.getBeansOfType(EmbeddedServletContainerCustomizer.class,
									false, false)
							.values());
			Collections.sort(this.customizers, AnnotationAwareOrderComparator.INSTANCE);
			this.customizers = Collections.unmodifiableList(this.customizers);
		}
		return this.customizers;
	}

}

 

使用:

1、实现EmbeddedServletContainerCustomizer接口
2、注册到spring上下文

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值