springboot 嵌入式 tomcat自定义配置

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类对容器做自定义修改,值得注意的是,这里的修改不会被配置文件里的配置所覆盖

你可能感兴趣的:(spring-boot)