您的位置:首页 > 运维架构 > Tomcat

springboot 嵌入式 tomcat自定义配置

2018-01-09 16:20 375 查看

springboot内置了tomcat,如果我们有自定义需求该怎么做呢?

配置EmbeddedServletContainerFactory

@Bean
public EmbeddedServletContainerFactory embeddedServletContainerFactory() {
TomcatEmbeddedServletContainerFactory embeddedServletContainerFactory = new TomcatEmbeddedServletContainerFactory();
embeddedServletContainerFactory.setPort(80);
embeddedServletContainerFactory.setDisplayName("嵌入式tomcat测试");
embeddedServletContainerFactory.setSessionTimeout(30, TimeUnit.SECONDS);
return embeddedServletContainerFactory;
}


通过分析 EmbeddedWebApplicationContext 类得知:

private void createEmbeddedServletContainer() {
EmbeddedServletContainer localContainer = this.embeddedServletContainer;
ServletContext localServletContext = getServletContext();
if (localContainer == null && localServletContext == null) {
EmbeddedServletContainerFactory containerFactory = getEmbeddedServletContainerFactory();
this.embeddedServletContainer = containerFactory
.getEmbeddedServletContainer(getSelfInitializer());
}
else if (localServletContext != null) {
try {
getSelfInitializer().onStartup(localServletContext);
}
catch (ServletException ex) {
throw new ApplicationContextException("Cannot initialize servlet context",
ex);
}
}
initPropertySources();
}


springboot 会通过EmbeddedServletContainerFactory类来创建servlet容器,所以我们可以配置该Bean来达到自定义的效果,需要注意的是,通过该类自定义的配置会被自定义的配置所覆盖,列如application.properties 里的参数可以覆盖这里的配置

配置 EmbeddedServletContainerCustomizer

@Bean
public EmbeddedServletContainerCustomizer containerCustomizer(ConfigurableEmbeddedServletContainer configurableEmbeddedServletContainer) {
return new EmbeddedServletContainerCustomizer(){
public void customize(ConfigurableEmbeddedServletContainer container) {
container.addErrorPages(new ErrorPage(HttpStatus.NOT_FOUND, "/error/500"));
container.addErrorPages(new ErrorPage(HttpStatus.BAD_GATEWAY, "/error/500"));
container.setDisplayName("ABC");
container.setPort(9999);
}
};
}


springboot里面有这样一个类

EmbeddedServletContainerCustomizerBeanPostProcessor,

查看该类继承层次

public class EmbeddedServletContainerCustomizerBeanPostProcessor

implements BeanPostProcessor, ApplicationContextAware,再看看下面这个方法

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


由此得知,springboot会在servlet容器初始化时通过EmbeddedServletContainerCustomizerBeanPostProcessor类对容器做自定义修改,值得注意的是,这里的修改不会被配置文件里的配置所覆盖
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: