玩转Spring Boot 自定义配置、导入XML配置与外部化配置


      在这里我会全面介绍在Spring Boot里面如何自定义配置,更改Spring Boot默认的配置,以及介绍各配置的优先级顺序。Spring Boot使用一个全局的配置文件application.properties,Spring Boot 支持使用YAML语言的配置文件,YAML是以数据位中心的语言,所以使用application.yml作为全局配置也是同样的效果,如果使用YAML替代properties注意写法,冒号后面要加个空格,否则会解析不出来。而且在Spring
Boot里面配置名称支持多种方式,例如:server.ssl.key-store,可以写成:server.ssl.keyStore都是可以的。下面具体详细介绍。

1.引用XML文件配置

      在实际项目中有的情况需要使用到XML配置文件,或者是你还不习惯用Java 配置的方式,那么你可以通过在入口启动类上加上@ImportResource(value = { "路径" })或者使用@ImportResource(locations= { "路径" }),一样的效果,多个XML文件的话你可以用逗号“,”分隔,就这样轻而易举的引用XML配置。

2.引入多个@Configuration 配置类

      在实际项目中可能不会把所有的配置都放在一个配置类(用@Configuration注解的类)中,可能会分开配置。这时可以用@Import注解引用。

3.引用自定义properties

      Spring Boot使用全局配置(application.properties)提供了很多的默认的配置属性。在开发的时候,大多数会用到自定义的一些配置属性,例如:指定上传文件保存的路径,定义:file.upload.stor-path=E:/test/,Spring Boot 提供了@Value注解获取properties中的属性,还提供了基于类型安全的配置方式,通过@ConfigurationProperties将properties属性注入到一个Bean中,在1.4以上版本官方不建议使用@ConfigurationProperties来指定properties文件位置。接下来请看实例:
      在pom.xml中加入以下依赖:
  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-configuration-processor</artifactId>
  4. <optional>true</optional>
  5. </dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>

第一种:
     (1) 在src/main/resources下新建application.properties文件并加入以下代码:
  1. file.upload.stor-path=E:/test/
file.upload.stor-path=E:/test/

(2)直接使用@Value注解方式,具体代码如下:

  1. package com.chengli.springboot.helloworld;
  2. import org.springframework.beans.factory.annotation.Value;
  3. import org.springframework.boot.SpringApplication;
  4. import org.springframework.boot.autoconfigure.SpringBootApplication;
  5. import org.springframework.web.bind.annotation.RequestMapping;
  6. import org.springframework.web.bind.annotation.RestController;
  7. @RestController
  8. @SpringBootApplication
  9. public class SampleController {
  10. @Value(value = "${file.upload.stor-path}")
  11. private String storPath;
  12. @RequestMapping("/")
  13. String home() {
  14. return "Hello World! file.upload.stor-path为:" + storPath;
  15. }
  16. public static void main(String[] args) throws Exception {
  17. SpringApplication springApplication = new SpringApplication(SampleController.class);
  18. springApplication.run(args);
  19. }
  20. }
package com.chengli.springboot.helloworld;

import org.springframework.beans.factory.annotation.Value;

import org.springframework.boot.SpringApplication;

import org.springframework.boot.autoconfigure.SpringBootApplication;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RestController; @RestController

@SpringBootApplication

public class SampleController {

@Value(value = "${file.upload.stor-path}")

private String storPath;
@RequestMapping("/")
String home() {
return "Hello World! file.upload.stor-path为:" + storPath;
} public static void main(String[] args) throws Exception {
SpringApplication springApplication = new SpringApplication(SampleController.class);
springApplication.run(args);
}

}

第二种:

      属性配置放在application.properties文件中,使用@ConfigurationProperties将配置属性注入到Bean中,代码如下:
      (1)定义FileUploadProperties类
  1. package com.chengli.springboot.helloworld;
  2. import org.springframework.boot.context.properties.ConfigurationProperties;
  3. import org.springframework.stereotype.Component;
  4. @Component
  5. @ConfigurationProperties(prefix = "file.upload")
  6. public class FileUploadProperties {
  7. private String storPath;
  8. public String getStorPath() {
  9. return storPath;
  10. }
  11. public void setStorPath(String storPath) {
  12. this.storPath = storPath;
  13. }
  14. }
package com.chengli.springboot.helloworld;

import org.springframework.boot.context.properties.ConfigurationProperties;

import org.springframework.stereotype.Component; @Component

@ConfigurationProperties(prefix = "file.upload")

public class FileUploadProperties {

private String storPath;
public String getStorPath() {
return storPath;
} public void setStorPath(String storPath) {
this.storPath = storPath;
}

}

      (2)入口启动类代码如下:

  1. package com.chengli.springboot.helloworld;
  2. import org.springframework.beans.factory.annotation.Autowired;
  3. import org.springframework.boot.SpringApplication;
  4. import org.springframework.boot.autoconfigure.SpringBootApplication;
  5. import org.springframework.web.bind.annotation.RequestMapping;
  6. import org.springframework.web.bind.annotation.RestController;
  7. @RestController
  8. @SpringBootApplication
  9. public class SampleController {
  10. @Autowired
  11. private FileUploadProperties fileUploadProperties;
  12. @RequestMapping("/")
  13. String home() {
  14. return "Hello World! file.upload.stor-path为:" + fileUploadProperties.getStorPath();
  15. }
  16. public static void main(String[] args) throws Exception {
  17. SpringApplication springApplication = new SpringApplication(SampleController.class);
  18. springApplication.run(args);
  19. }
  20. }
package com.chengli.springboot.helloworld;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.boot.SpringApplication;

import org.springframework.boot.autoconfigure.SpringBootApplication;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RestController; @RestController

@SpringBootApplication

public class SampleController {

@Autowired

private FileUploadProperties fileUploadProperties;
@RequestMapping("/")
String home() {
return "Hello World! file.upload.stor-path为:" + fileUploadProperties.getStorPath();
} public static void main(String[] args) throws Exception {
SpringApplication springApplication = new SpringApplication(SampleController.class);
springApplication.run(args);
}

}

      注意:这里我对FileUploadProperties使用了@Component注解,如果没有使用@Component注解,则需要在入口启动类上加上@EnableConfigurationProperties注解。Spring Boot 在properties文件中支持使用SpEL表达式,可以进行校验(校验注解使用的是javax.validation)等操作。

例如以下:
(1)随机数:
          test.int.random=${random.int}
(2)数组注入
          test.int.random[0]=${random.int}
          test.int.random[1]=${random.int}
(3)校验
         @NotNull

         private String storPath;

4.外部化配置(配置方式与优先级)

      Spring Boot 允许外化配置,Spring Boot使用了一个特别的PropertySource次序来允许对值进行覆盖,覆盖的优先级顺序如下:
  (1)Devtools全局设置主目录(~ /.spring-boot-devtools.properties 为活跃的)。
  (2)@TestPropertySource注解在Test。
  (3)@SpringBootTest#properties 注解在Test。
  (4)命令行参数。
  (5)从SPRING_APPLICATION_JSON属性(内联JSON嵌入在一个环境变量或系统属性)。
  (6)ServletConfig init参数。
  (7)ServletContext init参数。
  (8)JNDI属性java:comp/env。
  (9)Java系统属性(System.getProperties())。
  (10)操作系统环境变量。
  (11)RandomValuePropertySource配置的random.*属性值
  (12)打包在jar以外的application-{profile}.properties或application.yml配置文件
  (13)打包在jar以内的application-{profile}.properties或application.yml配置文件
  (14)打包在jar以外的application.properties或application.yml配置文件
  (15)打包在jar以内的application.properties或application.yml配置文件
  (16)@configuration注解类上的@PropertySource。
  (17)默认的属性(使用SpringApplication.setDefaultProperties指定)。

a) 通过命令行来修改默认参数,例如:
     启动命令:java -jar *.jar --name="chengli"
     以上的意思是,将name值修改为:chengli
b) 通过命令行来设置加载properties 例如:
     java -jar *.jar --spring.profiles.active=dev
     这里如果不了解profile的话,后面的文章中会介绍到。

5.application.properties文件按优先级,优先级高的会覆盖优先级低的

   优先级顺序如下:
  (1)当前目录下的一个/config子目录
  (2)当前目录
  (3)一个classpath下的/config包
  (4)classpath根目录


有兴趣的朋友可以加群探讨相互学习:

Spring Boot QQ交流群:599546061

玩转Spring Boot 自定义配置、导入XML配置与外部化配置的更多相关文章

  1. Dubbo 新编程模型之外部化配置

    外部化配置(External Configuration) 在Dubbo 注解驱动例子中,无论是服务提供方,还是服务消费方,均需要转配相关配置Bean: @Bean public Applicatio ...

  2. SpringBoot外部化配置使用Plus版

    本文如有任何纰漏.错误,请不吝指正! PS: 之前写过一篇关于SpringBoo中使用配置文件的一些姿势,不过嘛,有句话(我)说的好:曾见小桥流水,未睹观音坐莲!所以再写一篇增强版,以便记录. 序言 ...

  3. 关于SpringBoot的外部化配置使用记录

    关于SpringBoot的外部化配置使用记录 声明: 若有任何纰漏.错误请不吝指出! 记录下使用SpringBoot配置时遇到的一些麻烦,虽然这种麻烦是因为知识匮乏导致的. 记录下避免一段时间后自己又 ...

  4. 玩转spring boot——properties配置

    前言 在以往的java开发中,程序员最怕大量的配置,是因为配置一多就不好统一管理,经常出现找不到配置的情况.而项目中,从开发测试环境到生产环境,往往需要切换不同的配置,如测试数据库连接换成生产数据库连 ...

  5. Spring Boot 2.X(四):Spring Boot 自定义 Web MVC 配置

    0.准备 Spring Boot 不仅提供了相当简单使用的自动配置功能,而且开放了非常自由灵活的配置类.Spring MVC 为我们提供了 WebMvcConfigurationSupport 类和一 ...

  6. 峰哥说技术:06-手撸Spring Boot自定义启动器,解密Spring Boot自动化配置原理

    Spring Boot深度课程系列 峰哥说技术—2020庚子年重磅推出.战胜病毒.我们在行动 06  峰哥说技术:手撸Spring Boot自定义启动器,解密Spring Boot自动化配置原理 Sp ...

  7. Spring Boot自定义配置与加载

    Spring Boot自定义配置与加载 application.properties主要用来配置数据库连接.日志相关配置等.除了这些配置内容之外,还可以自定义一些配置项,如: my.config.ms ...

  8. Spring Boot自定义Redis缓存配置,保存value格式JSON字符串

    Spring Boot自定义Redis缓存,保存格式JSON字符串 部分内容转自 https://blog.csdn.net/caojidasabi/article/details/83059642 ...

  9. Spring Boot 自定义kafka 消费者配置 ContainerFactory最佳实践

    Spring Boot 自定义kafka 消费者配置 ContainerFactory最佳实践 本篇博文主要提供一个在 SpringBoot 中自定义 kafka配置的实践,想象这样一个场景:你的系统 ...

随机推荐

  1. Android之RelativeLayout相对布局

    1.相关术语解释 1.基本属性 gravity :设置容器内组件的对齐方式 ignoreGravity : 设置该属性为true的组件,将不受gravity属性的影响 2.根据父容器定位 layout ...

  2. java实现从实体到SQL语句的转换

    使用过Hibernate,EF之类的ORM框架都知道一般的CRUD之类的简单操作,只要调用框架封装好了的方法,框架就自动生成相应的SQL语句了,参照实习公司给的代码,那个是C#版的,今天弄了一下jav ...

  3. visio去除直线交叉处的歪曲

    1 问题描述 Visio画图时,两根直线交叉时,总是默认会出现一个跨线的标志,如下图所示: 2 解决办法 在2007前的版本,可以通过以下方式解决: 选中线条,然后菜单的格式->行为->连 ...

  4. 如何解决mysql服务器load高

    .登录主机 # ssh hostname .确定是否是mysql导致 # top .查看是哪些sql正在慢查询 # mysql -h hostname -P port -u username # sh ...

  5. anime.js 学习笔记

    官网演示/文档 anime.js 是一个简便的JS动画库,用法简单而且适用范围广,涵盖CSS,DOM,SVG还有JS的对象,各种带数值属性的东西都可以动起来. 实际演示和代码,官网写得很详细清楚了,这 ...

  6. Spring注解驱动开发(四)-----aop、声明式事务

    AOP 概念 指在程序运行期间动态的将某段代码切入到指定方法指定位置进行运行的编程方式:-----基于动态代理 一个aop示例 1.导入aop模块:Spring AOP:(spring-aspects ...

  7. 组件:参数验证props:组件参数验证语法

    <!DOCTYPE html> <html lang="zh"> <head> <title></title> < ...

  8. Vue 获取dom元素之 ref 和 $refs 详解

    一.$refs 一个对象,持有ref注册过的所有元素或子组件.(注册过的 ref 的集合) 二.ref 被用来给元素或子组件注册引用信息.若用在dom元素上,引用指向的就是dom元素:若用在子组件上, ...

  9. 加载框(loading)

    一般在用户提交数据或者新加载页面时,请求服务器的过程,页面没有响应,但是用户并不知道,此时在发生什么.这时,就需要loading框给用户提示,增加用户体验. 1.引入loading.css. html ...

  10. Cesium官方教程5--地形图层

    原文地址:https://cesiumjs.org/tutorials/Terrain-Tutorial/ Cesium支持渐进流式加载和渲染全球高精度地形,并且包含海.湖.河等水面效果.相对2D地图 ...