解决springboot application.properties server.port配置问题

目录
  • springboot application.properties server.port配置的问题
    • 下面就其中一个小问题做个记录
    • 内嵌tomcat的jar包依赖包含在pom中
  • Spring Boot server.port配置原理
    • 1. autoConfigure
    • 2. embed tomcat如何使用
    • 总结

springboot application.properties server.port配置的问题

近年来,springboot以其快速构建方便便捷,开箱即用,约定优于配置(Convention Over Configuration)的特性深受广大开发者喜爱。

springboot已经集成配置好了一套web开发的默认配置,开发者可以无需修改任何配置即可开始一个web工程,但是实际情况中有时候开发者还是需要修改部分默认配置项来使其更加契合自己的项目需求。

下面就其中一个小问题做个记录

在配置服务启动的端口时,springboot默认在application.properties配置文件中提供了server.port配置项来

让开发者自行配置服务启动端口号,**但是注意:**

#服务启动端口号
server.port=8889

该配置项要想生效其实是依赖于项目中内嵌的tomcat容器,如下图:

内嵌tomcat的jar包依赖包含在pom中

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

如果pom中不引人上述依赖,那么项目中不会导入内嵌tomcat的jar包,相应的application.properties配置文件中server.port配置项也将无法生效,因为该配置项实际上修改的就是内嵌tomcat的web端口号。

Spring Boot server.port配置原理

我们经常配置server.port=xxx,但其实这是一个比较复杂的过程才生效的,这次讲讲生效的过程。

1. autoConfigure

本质来源于自动配置

org.springframework.boot.autoconfigure.web.servlet.ServletWebServerFactoryConfiguration

TomcatServletWebServerFactory

为什么是这个类,核心是beanPostProcess原理

@ConfigurationProperties(prefix = "server", ignoreUnknownFields = true)
public class ServerProperties {

	/**
	 * Server HTTP port.
	 */
	private Integer port;

beanPostProcess

public class WebServerFactoryCustomizerBeanPostProcessor implements BeanPostProcessor, BeanFactoryAware {

	private ListableBeanFactory beanFactory;
	private List<WebServerFactoryCustomizer<?>> customizers;
	@Override
	public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
		if (bean instanceof WebServerFactory) {
			postProcessBeforeInitialization((WebServerFactory) bean);
		}
		return bean;
	} 

	@SuppressWarnings("unchecked")
	private void postProcessBeforeInitialization(WebServerFactory webServerFactory) {
		LambdaSafe.callbacks(WebServerFactoryCustomizer.class, getCustomizers(), webServerFactory)
				.withLogger(WebServerFactoryCustomizerBeanPostProcessor.class)
				.invoke((customizer) -> customizer.customize(webServerFactory));
	}

    private Collection<WebServerFactoryCustomizer<?>> getCustomizers() {
		if (this.customizers == null) {
			// Look up does not include the parent context
			this.customizers = new ArrayList<>(getWebServerFactoryCustomizerBeans());
			this.customizers.sort(AnnotationAwareOrderComparator.INSTANCE);
			this.customizers = Collections.unmodifiableList(this.customizers);
		}
		return this.customizers;
	}

	@SuppressWarnings({ "unchecked", "rawtypes" })
	private Collection<WebServerFactoryCustomizer<?>> getWebServerFactoryCustomizerBeans() {
		return (Collection) this.beanFactory.getBeansOfType(WebServerFactoryCustomizer.class, false, false).values();
	}

最终

beanFactory.getBeansOfType(WebServerFactoryCustomizer.class, false, false).values()

WebServerFactoryCustomizer对象.customize(webServerFactory)

@Configuration
@AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE)
@ConditionalOnClass(ServletRequest.class)
@ConditionalOnWebApplication(type = Type.SERVLET)
@EnableConfigurationProperties(ServerProperties.class)
@Import({ ServletWebServerFactoryAutoConfiguration.BeanPostProcessorsRegistrar.class,
		ServletWebServerFactoryConfiguration.EmbeddedTomcat.class,
		ServletWebServerFactoryConfiguration.EmbeddedJetty.class,
		ServletWebServerFactoryConfiguration.EmbeddedUndertow.class })
public class ServletWebServerFactoryAutoConfiguration {

	@Bean
	public ServletWebServerFactoryCustomizer servletWebServerFactoryCustomizer(ServerProperties serverProperties) {
		return new ServletWebServerFactoryCustomizer(serverProperties);
	}

这里就将port设置好了。

这里使用函数式编程,lambda表达式,将port的值设置进了

ConfigurableServletWebServerFactory ,即TomcatServletWebServerFactory对象

2. embed tomcat如何使用

tomcat创建时,会通过getBean方式获取工厂

就是 TomcatServletWebServerFactory

然后设置connector,从TomcatServletWebServerFactory读取port,设置connector,设置结束

总结

Spring Boot在解耦的时候绕了很多弯,先@Bean factory对象,然后BeanPostProcess,然后启动embed tomcat 在factory 中new Tomcat 然后设置Connector,设置port。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • 详解SpringBoot修改启动端口server.port的四种方式

    方式一: 配置文件 application.properties server.port=7788 方式二: java启动命令 # 以应用参数的方式 java -jar <path/to/my/jar> --server.port=7788 # 或以 JDK 参数的方式 java -Dserver.port=7788 -jar <path/to/my/jar> 方式三: 环境变量 SERVER_PORT Linux: SERVER_PORT=7788 java -jar <p

  • springBoot server.port=-1的含义说明

    springBoot server.port=-1的含义 今天遇到这种新奇的写法,项目是可以正常启动的. 然而http的端口有范围:1-65535.-1是访问不了的 而且只要是负数,最终启动日志打印的都是 Tomcat started on port(s): -1 (http) with context path '' 那springBoot放开负一端口的含义是什么,直接到官方文档中找答案: 明确说明了,放开-1是为了:完全关闭HTTP端点,但仍创建一个WebApplicationContext

  • springboot 设置server.port不生效的原因及解决

    springboot 设置server.port不生效 近年来,springboot以其快速构建方便便捷,开箱即用,约定优于配置(Convention Over Configuration)的特性深受广大开发者喜爱. springboot已经集成配置好了一套web开发的默认配置,开发者可以无需修改任何配置即可开始一个web工程,但是实际情况中有时候开发者还是需要修改部分默认配置项来使其更加契合自己的项目需求. 下面就其中一个小问题做个记录 在配置服务启动的端口时,springboot默认在app

  • 解决springboot application.properties server.port配置问题

    目录 springboot application.properties server.port配置的问题 下面就其中一个小问题做个记录 内嵌tomcat的jar包依赖包含在pom中 Spring Boot server.port配置原理 1. autoConfigure 2. embed tomcat如何使用 总结 springboot application.properties server.port配置的问题 近年来,springboot以其快速构建方便便捷,开箱即用,约定优于配置(Co

  • springboot设置了server.port但是没有用,还是8080问题

    目录 springboot设置了server.port但是没有用,还是8080 springboot修改启动端口server.port springboot设置了server.port但是没有用,还是8080 说来好笑,原来application拼写错了,写成了appliaction,所以细心很重要. springboot修改启动端口server.port 以应用参数的方式 java -jar XXXXX.jar --server.port=10000 或以 JDK 参数的方式 java -Ds

  • 解决SpringBoot application.yaml文件配置schema 无法执行sql问题

    目录 SpringBoot application.yaml文件配置schema 无法执行sql pom.xml配置文件 根路径下放了2个sql文件 springboot2.0之schema.sql问题 重点:配置init-ALWAYS (大写!) SpringBoot application.yaml文件配置schema 无法执行sql 据说1.0版本的SpringBoot没有这样的问题,我用的2.1.3版本的,出现了这样的问题. pom.xml配置文件 根路径下放了2个sql文件 启动的时候

  • springboot application.properties 文件注入数组方式

    目录 application.properties 文件注入数组 在application.properties中注入value,list和map 配置文件 注解 数据注入 application.properties 文件注入数组 1.application.properties ips=192.168.0.105,192.168.0.106,0:0:0:0:0:0:0:1 2.代码 @Value("#{'${ips}'.split(',')}") private List<S

  • springboot 如何修改默认端口及application.properties常用配置

    springboot 修改默认端口及application.properties常用配置 Spring boot 默认端口是8080,如果想要进行更改的话,只需要修改applicatoin.properties文件,在配置文件中加入: server.port=9090 其他常用配置: (一).server配置 server.address #指定server绑定的地址 server.compression.enabled #是否开启压缩,默认为false. server.compression.

  • 深入理解springboot中配置文件application.properties

    目录 前言 正文 自定义属性 参数间引用 使用自定义配置文件 随机值配置 外部配置-命令行参数配置 配置文件的优先级 Profile-多环境配置 总结 前言 Spring Boot使用"习惯优于配置"(项目中存在大量的配置,此外还内置了一个习惯性的配置,让你无需手动进行配置)的理念让你的项目快速运行起来.所以,我们要想把Spring Boot玩的溜,就要懂得如何开启各个功能模块的默认配置,这就需要了解Spring Boot的配置文件application.properties. 正文

  • 解决springboot+activemq启动报注解错误的问题

    springboot+activemq启动报注解错误 Description: Field jmsMessagingTemplate in com.haozz.demo.mq.PromoteActProducer required a bean of type 'org.springframework.jms.core.JmsMessagingTemplate' that could not be found. The injection point has the following anno

  • 解决springboot整合druid遇到的坑

    springboot整合druid的坑 项目环境 springboot 2.1.6.RELEASE jdk 1.8 pom.xml配置 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance&

  • 解决SpringBoot加载application.properties配置文件的坑

    SpringBoot加载application.properties配置文件的坑 事情的起因是这样的 一次,本人在现场升级程序,升级完成后进行测试,结果接口调用都报了这么个错误: 大概意思是https接口需要证书校验,这就奇怪了,项目启动加载的是包外的application.properties配置文件,配置文件里没有配置使用https啊.本人马上检查了下包内的application.properties配置文件,发现包内确实配置了https相关的配置项: 明明包外的配置文件优先级高于包内的,为

随机推荐