015-Spring Boot 定制和优化内嵌的Tomcat

一、内嵌web容器

  参看http://www.cnblogs.com/bjlhx/p/8372584.html

  查看源码可知提供以下三种:

    

二、定制优化tomcat

2.1、配置文件配置

  通过application.properties配置tomcat

  端口配置:server.port=10001
  地址配置:server.adress=192.168.1.1

     通过ServerProperties查看到tomcat变量,进入即可配置,如下

  启用日志配置:

server.tomcat.accesslog.enabled=true
server.tomcat.accesslog.directory=d:/logs

  原理分析  

  在spring-boot-autoconfigure-1.5.9.RELEASE.jar包中的org.springframework.boot.autoconfigure.web.ServerProperties查看

  可以查看到以上所示属性

2.2、通过代码方式配置一-实现EmbeddedServletContainerCustomizer接口

  EmbeddedServletContainerCustomizer→三个具体默认实现

    

  1》代码方式自定义

  定义一个类MyEmbeddedServletContainerCustomizer实现EmbeddedServletContainerCustomizer接口,即可

  设置基本配置

@Component
public class MyEmbeddedServletContainerCustomizer implements EmbeddedServletContainerCustomizer {

    @Override
    public void customize(ConfigurableEmbeddedServletContainer container) {
        System.out.println(container.getClass());
        TomcatEmbeddedServletContainerFactory factory =(TomcatEmbeddedServletContainerFactory)container;
        factory.setPort(8181);
        factory.setBaseDirectory(new File("d:/tmp/tomcat"));
    }
}

  设置日志

package com.lhx.spring.springboot_web;

import java.io.File;

import org.apache.catalina.valves.AccessLogValve;
import org.springframework.boot.context.embedded.ConfigurableEmbeddedServletContainer;
import org.springframework.boot.context.embedded.EmbeddedServletContainerCustomizer;
import org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainerFactory;
import org.springframework.stereotype.Component;

@Component
public class MyEmbeddedServletContainerCustomizer implements EmbeddedServletContainerCustomizer {

    @Override
    public void customize(ConfigurableEmbeddedServletContainer container) {
        System.out.println(container.getClass());
        TomcatEmbeddedServletContainerFactory factory =(TomcatEmbeddedServletContainerFactory)container;
        factory.setPort(8181);
        factory.setBaseDirectory(new File("d:/tmp/tomcat"));

        factory.addContextValves(getAccessLogValve());
    }

    private AccessLogValve getAccessLogValve() {
        AccessLogValve log = new AccessLogValve();
        log.setDirectory("d:/tmp/logs");
        log.setEnabled(true);
        log.setPattern("common");
        log.setPrefix("spring-boot-lhx-access-log");
        log.setSuffix(".txt");
        return log;

    }
}

  设置连接数配置、最大线程

package com.lhx.spring.springboot_web;

import java.io.File;

import org.apache.catalina.connector.Connector;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.context.embedded.ConfigurableEmbeddedServletContainer;
import org.springframework.boot.context.embedded.EmbeddedServletContainerCustomizer;
import org.springframework.boot.context.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainerFactory;
import org.springframework.stereotype.Component;

@Component
public class MyEmbeddedServletContainerCustomizer implements EmbeddedServletContainerCustomizer {

    @Override
    public void customize(ConfigurableEmbeddedServletContainer container) {
        System.out.println(container.getClass());
        TomcatEmbeddedServletContainerFactory factory =(TomcatEmbeddedServletContainerFactory)container;
        factory.setPort(8181);
        factory.setBaseDirectory(new File("d:/tmp/tomcat"));

        factory.addContextValves(getAccessLogValve());

        factory.addConnectorCustomizers(new MyTomcatConnectorCustomizers());
    }

    private AccessLogValve getAccessLogValve() {
        AccessLogValve log = new AccessLogValve();
        log.setDirectory("d:/tmp/logs");
        log.setEnabled(true);
        log.setPattern("common");
        log.setPrefix("spring-boot-lhx-access-log");
        log.setSuffix(".txt");
        return log;
    }

}
class MyTomcatConnectorCustomizers implements TomcatConnectorCustomizer{

    @Override
    public void customize(Connector connector) {
         Http11NioProtocol protocol =  (Http11NioProtocol)connector.getProtocolHandler();
         protocol.setMaxConnections(2000);
         protocol.setMaxThreads(500);
    }
}

2.5、通过代码方式配置二-默认配置类方式

package com.lhx.spring.springboot_web;

import org.springframework.boot.SpringBootConfiguration;
import org.springframework.boot.context.embedded.EmbeddedServletContainerFactory;
import org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainerFactory;
import org.springframework.boot.web.servlet.ErrorPage;
import org.springframework.context.annotation.Bean;
import org.springframework.http.HttpStatus;

@SpringBootConfiguration
public class WebServletConfiguration {
    @Bean
    public EmbeddedServletContainerFactory createEmbeddedServletContainerFactory() {
        TomcatEmbeddedServletContainerFactory factory = new TomcatEmbeddedServletContainerFactory();
        factory.setPort(1008);
        factory.addErrorPages(new ErrorPage(HttpStatus.NOT_FOUND, "/404.html"));
        return factory;
    }
}

  添加初始化

        factory.addInitializers((servletContext)->{
            System.out.println("----------servletContext startup----------");
        });

  此时可以获取到servletContext信息,可以进行添加Filter、设置Attribute等

  源码地址:https://github.com/bjlhx15/spring-boot.git

原文地址:https://www.cnblogs.com/bjlhx/p/8672848.html

时间: 2024-08-14 07:11:25

015-Spring Boot 定制和优化内嵌的Tomcat的相关文章

SpringBoot优化内嵌的Tomcat

SpringBoot测试版本 [html] view plain copy <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.3.3.RELEASE</version> </parent> <dependencies>

spring boot 启动web,内嵌tomcat

1.pom.xml文件配置(酌情修改) <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"

Spring Boot 源码之 内嵌Tomcat端口号赋值逻辑

一.Cumtomizer的Bean的定义 EmbeddedServletContainerAutoConfiguration.java 在处理自动配置的时候,扫描到这个Bean,注册到了BeanFactory里面 @AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE) @Configuration @ConditionalOnWebApplication(type = Type.SERVLET) @EnableConfigurationProperties

spring boot定制Jackson ObjectMapper,为什么不生效

先说结论: 项目中定制了spring 的redisTemplate,而这个template没有使用我自定义的Jackson ObjectMapper.所以不生效. 下面是详细过程: 起因是spring boot项目加入了shiro,我打算使用redis去存储shiro的会话,方便以后横向扩展. 参考了网上的实现后,决定通过扩展org.apache.shiro.session.mgt.eis.AbstractSessionDAO来实现. 以下是实现代码: 1 package com.ceiec.b

Spring Boot 定制URL匹配规则的方法

事情的起源:有人问我,说编写了一个/hello访问路径,但是吧,不管是输入/hello还是/hello.html,还是/hello.xxx都能进行访问.当时我还以为他对代码进行处理了,后来发现不是,后来发现这是Spring Boot路由规则.好了,有废话了下,那么看看我们解决上面这个导致的问题. 构建web应用程序时,并不是所有的URL请求都遵循默认的规则.有时,我们希望RESTful URL匹配的时候包含定界符“.”,这种情况在Spring中可以称之为“定界符定义的格式”:有时,我们希望识别斜

spring boot实战(第十五篇)嵌入tomcat源码分析

嵌入tomcat源码分析 在启动spring boot工程时利用@SpringBootApplication注解,该注解启动@EnableAutoConfiguration自动配置,加载META-INF/spring.factories文件 # Auto Configure org.springframework.boot.autoconfigure.EnableAutoConfiguration=org.springframework.boot.autoconfigure.admin.Spri

Spring boot如何打war包发布到tomcat

前言: 平时在使用java做项目开发时,首先想到利用框架来提升开发效率,和提高可维护性.选择spring可以使用ssm(spring框架,springMVC,mybatis),而且企业中应用也比较广泛,然而还是发现,在框架中有很多配置,而且看起来相当繁琐,并且在这些配置中,大部分都属于默认配置,习惯配置.因此spring boot就此诞生,它的主要目的就是实现"0"配置,此处的"0"不是代表没有配置,而是代表极少的配置.并且spring boot还内置了tomcat

Spring boot 定制自己的错误

1).如何定制错误的页面: ? 1).有模板引擎的情况下:error/状态码; [将错误页面命名为 错误状态码.html 放在模板引擎文件夹里面的 error文件夹下],发生此状态码的错误就会来到 对应的页面: ? 我们可以使用4xx和5xx作为错误页面的文件名来匹配这种类型的所有错误,精确优先(优先寻找精确的状态码.html): ? 页面能获取的信息: ? timestamp:时间戳 ? status:状态码 ? error:错误提示 ? exception:异常对象 ? message:异常

spring boot项目打包成war并在tomcat上运行的步骤

把spring-boot项目按照平常的web项目一样发布到tomcat容器下 一.修改打包形式 在pom.xml里设置 <packaging>war</packaging> 二.移除嵌入式tomcat插件 在pom.xml里找到spring-boot-starter-web依赖节点,在其中添加如下代码, 第一种<dependency> <groupId>org.springframework.boot</groupId> <artifact