Spring Boot的自动配置与自定义配置(附配置优先级表)

这篇具有很好参考价值的文章主要介绍了Spring Boot的自动配置与自定义配置(附配置优先级表)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

相比于Spring MVC,Spring Boot省去了繁琐的配置,提供了大部分场景下的默认配置,用户可以在不做任何配置的情况下使用Spring Boot框架进行开发。如果默认的参数并不能满足用户的需求,也只需创建一个配置文件并加上自定义的配置。Spring Boot的主导思想,想必大家也并不陌生,即:约定优于配置。

本文将简要介绍Spring Boot的自动配置原理,以及自动配置不能满足要求时,如何自定义配置。

一、Spring Boot的自动配置

Spring Boot之所以能做到自动配置,主要靠的是@EnableAutoConfiguration注解。这个注解集成于程序启动类注解@SpringBootApplication中。

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(
    excludeFilters = {@Filter(
    type = FilterType.CUSTOM,
    classes = {TypeExcludeFilter.class}
), @Filter(
    type = FilterType.CUSTOM,
    classes = {AutoConfigurationExcludeFilter.class}
)}
)
public @interface SpringBootApplication {
	...
}

查看@EnableAutoConfiguration的源码,发现两个主要注解:@AutoConfigurationPackage和@Import。

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import({AutoConfigurationImportSelector.class})
public @interface EnableAutoConfiguration {
    String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration";

    Class<?>[] exclude() default {};

    String[] excludeName() default {};
}

查看@AutoConfigurationPackage注解,发现也使用了@Import注解,所以有必要先搞懂这个注解的作用。这里推荐一篇博文,感兴趣的朋友可以看一下。

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@Import({AutoConfigurationPackages.Registrar.class})
public @interface AutoConfigurationPackage {
    String[] basePackages() default {};

    Class<?>[] basePackageClasses() default {};
}

回到主题,@EnableAutoConfiguration中@Import注解通过引入ImportSelector实现类的方式将依赖中的默认配置加载到容器中。AutoConfigurationImportSelector类的具体内容在这里不做分析,这个过程简而言之就是:

查看Jar包中META-INF/spring.factories文件,获取其中EnableAutoConfiguration配置的value值。value值是由多个url组成,一个url表示一个配置类的全类名。然后通过@Import注解导入这些配置类。

@AutoConfigurationPackage中的@Import是通过引入ImportBeanDefinitionRegistrar实现类方式将各种组件和配置引入Spring容器的。简而言之,就是将标注了该注解的类所在的package设置成为自动配置package,这样主程序所在的包及其子包中的组件都能够被扫描到Spring容器中。

案例

下面将通过Tomcat端口配置举例,版本是spring-boot-actuator-autoconfigure-2.4.2.jar。解压之后打开META-INF/spring.factoryies文件,发现org.springframework.boot.autoconfigure.EnableAutoConfiguration配置中如下配置类:

# Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
...
org.springframework.boot.autoconfigure.web.servlet.HttpEncodingAutoConfiguration,\
...

查看该配置类源码:

@Configuration(proxyBeanMethods = false)
@EnableConfigurationProperties(ServerProperties.class)
@ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.SERVLET)
@ConditionalOnClass(CharacterEncodingFilter.class)
@ConditionalOnProperty(prefix = "server.servlet.encoding", value = "enabled", matchIfMissing = true)
public class HttpEncodingAutoConfiguration {
	...
}

我们重点关注@EnableConfigurationProperties(ServerProperties.class),这个注解的作用是使某个被@ConfigurationProperties标注的类生效,这里指的就是ServerProperties类,我们查看ServerProperties类的源码:

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

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

		/**
		 * Network address to which the server should bind.
		 */
		private InetAddress address;
		...
}

顺便提一句,@ConfigurationProperties是springboot提供读取配置文件的一个注解,它支持属性文件和bean的映射,一般和@component配合使用,不然容器无法获取。如果单独使用@ConfigurationProperties,需要结合@EnableConfigurationProperties(ServerProperties.class)将其注册到spring容器中。

prefix = "server"表示该配置使用server前缀,和属性port结合起来就是:server.port。我们都知道Tomcat的默认端口是8080,那么这个参数又是在哪里配置的呢?答案是META-INF/spring-configuration-metadata.json。

{
	"name": "server.port",
    "defaultValue": 8080
}

可以看到文件中有这么一条配置,这就是我们需要的server.port = 8080。

二、自定义配置

学习完以上内容,想要自定义配置就简单多了,还是以Tomcat为例,如果我想将端口改为8081,只需在application.properties文件中加上:

server.port = 8081

至于为什么最终生效的是server.port = 8081而非server.port = 8080,就要提到Spring Boot中的配置优先级了,Spring Boot会按照从上到下的顺序加载:

  • 命令行参数;
  • 来自 java:comp/env 的 JNDI 属性;
  • Java 系统属性(System.getProperties()) ;
  • 操作系统环境变量;
  • RandomValuePropertySource 配置的 random.*属性值;
  • jar 包外部的 application-{profile}.properties 或 application.yml(带 spring.profile)配置文件;
  • jar 包内部的 application-{profile}.properties 或 application.ym(带 spring.profile)配置文件;
  • jar 包外部的 application.properties 或 application.yml(不带 spring.profile)配置文件;
  • jar 包内部的 application.properties 或 application.ym(不带 spring.profile)配置文件;
  • @Configuration 注解类上的@PropertySource;
  • 通过 SpringApplication.setDefaultProperties 指定的默认属性。

参考:

《深入浅出Spring Boot 2.x》文章来源地址https://www.toymoban.com/news/detail-434191.html

到了这里,关于Spring Boot的自动配置与自定义配置(附配置优先级表)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • springboot-配置优先级

    类型 1.properties(三者同时存在,优先级最高) 2.yml 3.yaml(最低) 除此之外,可以在启动配置处修改 在jar包中修改配置属性 1.pom文件需要导入打包的插件 2.使用package命令 3.用打开目录的方式打开 4.在存放jar包的文件夹下打开命令行 5.java -jar jar包名,就能启动springboot项目 6.jav

    2024年02月12日
    浏览(45)
  • springboot 配置文件优先级

    springboot配置文件可以使用properties、yaml,一个系统中最好只使用一种格式,如果在同一个位置使用了properties、yaml,那么properties会覆盖yaml,个人推荐使用yaml,支持结构化,层次更清晰。 如果系统中有application.yml,application-specific.yml,jar包外也有application.yml,application-specif

    2024年02月13日
    浏览(35)
  • nacos配置文件优先级

    当前配置文件如下: 优先级:userservice-dev.yml(当前环境配置) userservice.yml(nacos上的) application.yml(本地的) 扩展配置(extension-configs) 共享配置(shared-configs) 同为扩展配置,存在如下优先级关系:extension-configs[3] extension-configs[2] extension-configs[1] extension-configs[0] 同为共享配置

    2024年02月12日
    浏览(39)
  • SpringBoot 配置文件加载优先级

    最近在使用k8s部署项目的时候,发现Dockerfile文件中的命令后面跟的参数,无法覆盖nacos中的参数,今天有时间正好来整理一下Springboot配置的加载顺序 整理加载顺序第一个肯定看官方文档:https://docs.spring.io/spring-boot/docs/2.2.9.RELEASE/reference/htmlsingle/#boot-features-external-config 看不懂我们直

    2024年02月02日
    浏览(41)
  • SpringBoot项目配置方式及优先级

    说明:SpringBoot支持以下五种方式配置方式,例如将项目的Tomcat端口从8080,更改为9000,可以使用如下方式配置 在启动窗口,鼠标右键,选择“Edit Configurations”,在弹出来的窗口中,在Program arguments,里面填“–server.port=9000”,配置格式为两个小横杠(–)开头 这种方式,可

    2024年02月08日
    浏览(43)
  • 【学习日记】【FreeRTOS】任务调度时如何考虑任务优先级——任务的自动切换

    本文开始为 RTOS 加入考虑任务优先级的自动调度算法,代码大部分参考野火。 本文主要是一篇学习笔记,加入了笔者自己对野火代码的梳理和理解。 首先我们要知道,在 RTOS 中,优先级越高、越需要被先执行的的任务的优先级的数字越大。比如优先级数字为 5 的任务就要比

    2024年02月12日
    浏览(36)
  • SpringBoot启动过程探究及配置文件优先级解析

    如果项目依赖中存在org.springframework.web.reactive.DispatcherHandler,并且不存在org.springframework.web.servlet.DispatcherServlet,那么应用类型为WebApplicationType.REACTIVE 如果项目依赖中不存在org.springframework.web.reactive.DispatcherHandler,也不存在org.springframework.web.servlet.DispatcherServlet,那么应用类型为

    2024年02月09日
    浏览(44)
  • Javaweb | 过滤器、配置、过滤器链、优先级

    💗wei_shuo的个人主页 💫wei_shuo的学习社区 🌐Hello World ! 概念 过滤器(Filter)是处于客户端与服务器目标资源之间的一道过滤技术 用户的请求和响应都需要经过过滤器 过滤器作用 执行地位在Servlet之前,客户端发送请求是,会先经过Filter,再到达目标Servlet中;响应时,会根

    2023年04月17日
    浏览(54)
  • SpringCloud + Nacos配置文件加载顺序和优先级详解

    在微服务架构中,合理地管理和理解配置文件的加载顺序与优先级对于确保应用的稳定性和灵活性至关重要。特别是在使用 Spring Cloud Alibaba Nacos 作为配置中心的场景下,这一点显得尤为重要。本文将基于一个具体的 bootstrap.yml 配置示例,深入探讨这些概念,并介绍如何通过

    2024年03月27日
    浏览(49)
  • Nacos配置文件管理、微服务获取Nacos配置文件、热更新、配置共享、配置优先级等

    传统项目中,当我们需要修改配置文件时,需要修改配置文件,停掉服务,重启服务,这样不利于提升用户体验; 而使用Nacos进行项目的配置文件管理,则可以实现热更新配置文件,在Nacos中修改之后,Nacos会通知项目新的配置文件。 添加配置文件 第一步,点击添加配置:

    2023年04月11日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包