机制:
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上下文