GVKun编程网logo

Spring Boot中的yaml配置简介(spring boot yaml)

28

本文将介绍SpringBoot中的yaml配置简介的详细情况,特别是关于springbootyaml的相关信息。我们将通过案例分析、数据研究等多种方式,帮助您更全面地了解这个主题,同时也将涉及一些关于

本文将介绍Spring Boot中的yaml配置简介的详细情况,特别是关于spring boot yaml的相关信息。我们将通过案例分析、数据研究等多种方式,帮助您更全面地了解这个主题,同时也将涉及一些关于(三) SpringBoot-YAML配置小结、java – Spring Boot中Spring Security的XML配置、java – 使用命令行参数覆盖spring-boot中的yml配置、Spring Boot Yaml配置以获取字符串列表的知识。

本文目录一览:

Spring Boot中的yaml配置简介(spring boot yaml)

Spring Boot中的yaml配置简介(spring boot yaml)

搞Spring Boot的小伙伴都知道,Spring Boot中的配置文件有两种格式,properties或者yaml,一般情况下,两者可以随意使用,选择自己顺手的就行了,那么这两者完全一样吗?肯定不是啦!本文就来和大伙重点介绍下yaml配置,最后再来看看yaml和properties配置有何区别。

狡兔三窟

首先application.yaml在Spring Boot中可以写在四个不同的位置,分别是如下位置:

  1. 项目根目录下的config目录中

  2. 项目根目录下

  3. classpath下的config目录中

  4. classpath目录下

四个位置中的application.yaml文件的优先级按照上面列出的顺序依次降低。即如果有同一个属性在四个文件中都出现了,以优先级高的为准。

那么application.yaml是不是必须叫application.yaml这个名字呢?当然不是必须的。开发者可以自己定义yaml名字,自己定义的话,需要在项目启动时指定配置文件的名字,像下面这样:

当然这是在IntelliJ IDEA中直接配置的,如果项目已经打成jar包了,则在项目启动时加入如下参数:

  
  
  
  1. java -jar myproject.jar --spring.config.name=app

这样配置之后,在项目启动时,就会按照上面所说的四个位置按顺序去查找一个名为app.yaml的文件。当然这四个位置也不是一成不变的,也可以自己定义,有两种方式,一个是使用 spring.config.location属性,另一个则是使用 spring.config.additional-location这个属性,在第一个属性中,表示自己重新定义配置文件的位置,项目启动时就按照定义的位置去查找配置文件,这种定义方式会覆盖掉默认的四个位置,也可以使用第二种方式,第二种方式则表示在四个位置的基础上,再添加几个位置,新添加的位置的优先级大于原本的位置。

配置方式如下:

这里要注意,配置文件位置时,值一定要以/结尾。

数组注入

yaml也支持数组注入,例如

  
  
  
  1. my:

  2. servers:

  3. - dev.example.com

  4. - another.example.com

这段数据可以绑定到一个带Bean的数组中:

  
  
  
  1. @ConfigurationProperties(prefix="my")

  2. @Component

  3. public class Config {


  4. private List<String> servers = new ArrayList<String>();


  5. public List<String> getServers() {

  6. return this.servers;

  7. }

  8. }

项目启动后,配置中的数组会自动存储到servers集合中。当然,yaml不仅可以存储这种简单数据,也可以在集合中存储对象。例如下面这种:

  
  
  
  1. redis:

  2. redisConfigs:

  3. - host: 192.168.66.128

  4. port: 6379

  5. - host: 192.168.66.129

  6. port: 6380

这个可以被注入到如下类中:

  
  
  
  1. @Component

  2. @ConfigurationProperties(prefix = "redis")

  3. public class RedisCluster {

  4. private List<SingleRedisConfig> redisConfigs;

  5. //省略getter/setter

  6. }

优缺点

不同于properties文件的无序,yaml配置是有序的,这一点在有些配置中是非常有用的,例如在Spring Cloud Zuul的配置中,当我们配置代理规则时,顺序就显得尤为重要了。当然yaml配置也不是万能的,例如,yaml配置目前不支持@PropertySource注解。

好了,关于YAML的配置就先说这么多,有问题欢迎留言讨论。

往期精彩回顾
2019新年福利,新书免费送!
Docker教程
Redis教程
SpringCloud教程
Git教程
MongoDB教程
SpringBoot+Vue前后端分离开源项目-微人事
SpringBoot+Vue前后端分离开源项目-V部落

本文分享自微信公众号 - 江南一点雨(a_javaboy)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

(三) SpringBoot-YAML配置小结

(三) SpringBoot-YAML配置小结

这是第三篇,关于YAML配置文件的小结篇,同样有兴趣的朋友可以去了解一下前两篇,感谢大家支持哈

(一) SpringBoot起飞之路-HelloWorld

(二) SpringBoot起飞之路-入门原理分析

说明:

  • 太忙啦,同时全放到一起,后来感觉移动端篇幅太长,阅读体验太差了,就打算分成几篇来发
  • 才疏学浅,就会点浅薄的知识,大家权当一篇工具文来看啦,不喜勿愤哈 ~

(一) SpringBoot配置文件类型

在前一篇的入门原理讲解中,我们简单有提到过关于自动配置的一些说明,我们演示的时候,仅仅在 srcmainresources 下的 application.properties 中写入 server.port=9090 就可以非常便捷的修改端口号

也就是说,SpringBoot是基于约定的,很多值都是默认存在的,如果想要进行一定的修改,我们就需要使用 application.properties或者application.yml(application.yaml)进行配置

properties,我们相对还是熟悉的,在过去 Spring 中的开发我们还算是经常用

这一篇主要讲解 yaml 这一类型

(二) yaml 简介

维基百科贴的简介

YAML是"YAML Ain''t a Markup Language"(YAML不是一种标记语言)的递归缩写。在开发的这种语言时,YAML 的意思其实是:"Yet Another Markup Language"(仍是一种标记语言),但为了强调这种语言以数据做为中心,而不是以标记语言为重点,而用反向缩略语重命名。

维基百科贴的功能介绍

YAM的语法和其他高级语言类似,并且可以简单表达清单、散列表,标量等数据形态,它使用空白符号缩进和大量依赖外观的特色,特别适合用来表达或编辑数据结构、各种配置文件、倾印调试内容、文件大。尽管它比较适合用来表达层次结构式的数据结构,不过也有精致的语法可以表示关系性的数据其让人最容易上手的特色是巧妙避开各种封闭符号,如:引号、各种括号等,这些符号在嵌套结构时会变得复杂而难以辨认

我们可以先看一个例子:

  • XML 配置
<server>
    <port>9090<port>
</server>
  • Properties 配置
server.port=9090
  • Yaml 配置
server:
  prot: 9090

从这么简单的例子来看,起码相较于 XML,Properties 和 Yaml 还是相对简洁的,如果涉及到一些复杂List 等等,XML 更是一种梦魇

所以,简单的概括一下:YAML语言文件,它以.yml作为后缀,因为相比较原来的 XML(主要) 或者 Properties ,语法简洁,可读性更好,由于其以数据为中心而非标记语言的特点,所以适合作为开发项目中的配置文件

(三) 基础语法

(1) 语法要求

  • value 与冒号之间的空格不能省略,例如 key: value ,'':'' 后面可是有空格的
  • 缩进表示层级关系,左对齐的一列数据为同一层级
  • 缩进不能用 Tab,只能用空空格
  • 语法中大小写是敏感的

(2) 配置普通数据

普通数据在这里值得是:数字,布尔值,字符串

语法:

key: value

示例:

name: ideal
  • 普通数据的值直接写在冒号(加空格)后面,通常字符串也不需要加单双引号
  • “ ” 双引号会将转义字符,例如 “n” 当做换行符返回
  • '' '' 单引号不会解析转义,''n'' 会被当作字符串返回

(3) 配置对象数据、Map数据

语法:

  • 基本写法
key: 
  key1: value1
  key2: value2
  • 行内写法
key: {key1: value1,key2: value2}

示例:

user:
  name: Steven
  age:20
  address: beijing
user: {name:Steven,age: 20,address: beijing}  

说明:key1 前面空格个数是没有限定的,虽然默认是两格,但是只要是相同缩进,就代表是同一级别,用默认即可,仅此说明

(4) 配置数组、List、Set 数据

这里用 - 代表一个元素,注意 - 和 value1 等之间存在一个空格

语法:

  • 基本写法
key: 
  - value1
  - value2
  • 行内写法
key: [value1,value2]

示例:

province:
  - guangdong
  - hebei
  - sichuan
province: [guangdong,hebei,sichuan]

补充:当集合中元素为对象的时候,示例如下

user:
  - name: zhangsan
    age: 20
    address: beijing
  - name: lisi
    age: 28
    address: shanghai
  - name: wangwu
    age: 26
    address: shenzhen

(四) 配置文件与配置类的属性映射

(1) @Value映射

在Spring中,我们已经介绍过 @Value 注解,我们可以通过 @Value 注解将配置文件中的值映射到一个Spring管理的Bean的字段上

先创建一个简单的 User 类用来演示,就这么三个成员

@Component
public class User {
    private String name;
    private Integer age;
    private String address;
    ......补充 get、toString方法(set可以不写)
}

测试都是统一的

@Controller
public class UserController {
    @Autowired
    User user;

    @RequestMapping("/testUser")
    @ResponseBody
    public String testUser(){
       return user.toString();
    }
}

现在我们分三种演示一下

A:直接赋值

@Value("Tom")
private String name;

@Value("20")
private Integer age;

@Value("北京")
private String address;

B:Properties

application.properties

user1.name=Jack
user1.age=30
user1.address=北京

User

@Value("${user1.name}")
private String name;

@Value("${user1.age}")
private Integer age;

@Value("${user1.address}")
private String address;

C:Yaml

application.yml

user1:
  name: Steven
  age: 20
  address: 北京

User

@Value("${user1.name}")
private String name;

@Value("${user1.age}")
private Integer age;

@Value("${user1.address}")
private String address;

看一下 yaml 的测试结果

D:说明

① 配置优先级问题

properties、yaml、yml,这三种配置文件,如果同时都配置的话,其实三个文件中的配置信息都会生效,但是存在加载优先级问题,后加载的会覆盖先加载的文件,所当三个文件中有配置信息冲突时,虽然加载顺序是yml>yaml>properties,但你看到的实际上是最后出现的,所以优先级是:properties>yaml>yml,

② user 命名问题

上面 @Value("${user1.name}") 我全用了 user1,是因为如果 Windows 下 user.name,会获取到当前 Windows 用户的用户名

③ application

记得要在 application.properties 或者 application.yaml 或者 application.yml 中写,因为默认是去找这几个配置文件的,如果配置文件命名不对的话,是找不到的,当然后面会有办法解决

④ Properties 乱码问题

如果以前没有设置的话,中文肯定是会乱码的,下面补充一下设置的方法

将下面的勾选上,然后设置 Properties 编码为 UTF-8

(2) @ConfigurationProperties映射

看下的实体类中,使用了这个注解 @ConfigurationProperties(prefix="配置文件中的key的前缀"),它可以将配置文件中的配置自动与实体进行映射

注意:可能会提示一些错误,一般是没有影响的,解决方案放在文章下面,如果无影响,先做就可以了

A:配置实体类

@Value 如果成员比较多的也挺麻烦的,介绍一种更加方便的,这种以后会常用到,所以重写一个复杂一点的实体,演示的全面一些

注意:要使用 @ConfigurationProperties 来实现,就要给其成员添加 set 方法,而前面使用 @Value注解 则不需要也可以

@Component
@ConfigurationProperties(prefix = "student")
public class Student {

    private String name;
    private Integer age;
    private Date birthday;
    private Boolean graduate;
    private Map<String, Integer> score;
    private List<String> subject;
    private User u;
    ......补充 get set toString 方法
}

Student 类中引用的 User 类

@Component
public class User {
    private String name;
    private Integer age;
    private String address;
    ......补充 get set toString方法
}

B:yaml 配置

student:
  name: Steven
  age: 20
  birthday: 2020/01/01
  graduate: false
  score: {math: 90, english: 88}
  subject:
    - 高数
    - 大英
    - 大物
  u:
    name: Jack
    age: 30
    address: 北京

(3) 加载指定properties配置文件

补充一个关于加载指定properties配置文件的知识点

Spring默认使用 yml 中的配置,但有时候要用传统的xml或properties配置,顺便演示,正好引出一下,如果想要调用一个自定义的 properties 该怎么办?

用 @PropertySource 这个注解就可以了

@Component
@PropertySource(value = "classpath:user.properties")
@ConfigurationProperties(prefix = "usertest")
public class User {
    private String name;
    private Integer age;
    private String address;
    ......补充 get set toString方法
}

user.properties

usertest.name=Jack
usertest.age=30
usertest.address=北京

(五) 问题解决方案

1、Spring Boot Configuration Annotation Processor not found in classpath错误

IDEA 提示,springboot配置注解处理器没有找到,也就会给我们地址,让我们去看文档,但是有的文档不一定打得开,大家可以自己去官网找一找

先来看一下官网的说明

Generating Your Own Metadata by Using the Annotation Processor

You can easily generate your own configuration metadata file from items annotated with @ConfigurationProperties by using the spring-boot-configuration-processor jar. The jar includes a Java annotation processor which is invoked as your project is compiled. To use the processor, include a dependency on spring-boot-configuration-processor.

With Maven the dependency should be declared as optional, as shown in the following example:

所以添加注解就可以了

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-configuration-processor</artifactId>
    <optional>true</optional>
</dependency>

2、Re-run Spring Boot Configuration Annotation Processor to update generated metadata

一般加好依赖,就会弹出这个吗,这个问题可以忽略,不影响代码执行,应该只是一个提醒,提醒你进行必要的重启或者重新编译,我也没找到完美处理这个问题的方法,实在不顺眼也可以关闭 IDEA 的提示:

  • Setting 下搜索 Spring,找到 SpringBoot 取消勾选 show notification panel

(六) 疑惑占楼

对于,spring-boot-configuration-processor,网络上有的说法认为是用来引入@PropertySource的, 也有一种说法说是用来使 @ConfigurationProperties 生效的

@Component
@PropertySource(value = "classpath:user.properties")
@ConfigurationProperties(prefix = "usertest")
public class User {
    private String name;
    private Integer age;
    private String address;
    ......补充 get set toString方法
}

不过测试一下,不引入 spring-boot-configuration-processor 也能使用这两个注解,一直也没怎么去仔细考虑,都忽略了,如果了解的朋友,可以留言交流一下,以后有了合适的解释我重新更新一下,在此占楼

(七) 结尾

如果文章中有什么不足,欢迎大家留言交流,感谢朋友们的支持!

如果能帮到你的话,那就来关注我吧!如果您更喜欢微信文章的阅读方式,可以关注我的公众号

在这里的我们素不相识,却都在为了自己的梦而努力 ❤

一个坚持推送原创开发技术文章的公众号:理想二旬不止

java – Spring Boot中Spring Security的XML配置

java – Spring Boot中Spring Security的XML配置

我想将基于XML的配置用于Spring Security.第一个想法是使用SHA-256或任何其他散列函数用于用户密码.我找不到用普通java解决这个问题的好方法.所以我开始在xml中配置东西.当它开始变得有趣时,这就是重点.

我的配置:

> spring-boot 1.1.8.RELEASE
> spring-boot-starter- * 1.1.8
> tomcat-embed-jasper:8.0.8

弹簧security.xml文件:

ecurity"
             xmlns:beans="http://www.springframework.org/schema/beans"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xmlns:jdbc="http://www.springframework.org/schema/jdbc"
             xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
           http://www.springframework.org/schema/security
           http://www.springframework.org/schema/security/spring-security.xsd>

    ecurity="none"/>
    ecurity="none"/>

    login-page='/login.html'/>
    

我在类中加载xml文件,其中可以找到public static void main:

@Configuration
@ComponentScan
@EnableAutoConfiguration
@Order(HIGHEST_PRECEDENCE)
@ImportResource({
        "/spring-security.xml"
})
public class PhrobeBootApplication extends SpringBootServletInitializer {
...
}

但是我在任何pageload上都得到以下异常:

[ERROR] org.apache.catalina.core.ContainerBase.[Tomcat].[localhost].[/].[dispatcherServlet] - Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception
org.springframework.security.authentication.AuthenticationCredentialsNotFoundException: An Authentication object was not found in the SecurityContext 
...

所以看起来资源/ WEB-INF / web.xml的配置没有加载,如果我有一个好的understanding from the documentation,我应该在使用普通弹簧时使用它,没有启动. (应配置过滤器).我对吗?

为什么会发生这种错误?有没有更好的方法在spring-boot中使用基于xml的配置来实现spring-security? web.xml甚至可以通过tomcat加载吗?

最佳答案
我遇到了同样的问题,然后我改变了XML文件的路径,并将其保存在src / main / resources / spring中.它工作正常.

@SpringBootApplication

@ImportResource("classpath:/spring/spring-security.xml")

java – 使用命令行参数覆盖spring-boot中的yml配置

java – 使用命令行参数覆盖spring-boot中的yml配置

我有一个配置了yml文件的spring-boot应用程序.执行jar时是否可以覆盖这些属性?例如,假设我将yml文件中的输入变量设置为user1,我想用user2执行jar.可以这样做吗?

java -jar --input=user2
最佳答案
要详细说明answer by cLyric,您可以这样做:

java -jar yourapp.jar --input=user2

或者如果你想使用json提供,你可以这样做

java -jar yourapp.jar --spring.application.json='{"input":"user2"}'

或者如果你在unix / linux中,

SPRING_APPLICATION_JSON='{"input":"user2"}' java -jar yourapp.jar 

Spring Boot Yaml配置以获取字符串列表

Spring Boot Yaml配置以获取字符串列表

我正在尝试从application.yml文件加载字符串数组。这是配置:

ignore:    filenames:        - .DS_Store        - .hg

这是课程:

@Value("${ignore.filenames}")private List<String> igonoredFileNames = new ArrayList<>();

同一类中还有其他配置也可以加载。我的yaml文件中没有标签。我仍然得到以下异常:

Caused by: java.lang.IllegalArgumentException: Could not resolve placeholder ''ignore.filenames'' in string value "${ignore.filenames}"

答案1

小编典典

我的 猜测 是,@Value不能应对“复杂”类型。您可以使用以下prop类:

@Component@ConfigurationProperties(''ignore'')class IgnoreSettings {    List<String> filenames}

请注意: 此代码是 Groovy的 - 不是Java -保持示例短!有关如何采用的提示,请参见注释。

参见完整示例https://github.com/christoph-frick/so-springboot-yaml-string-
list

我们今天的关于Spring Boot中的yaml配置简介spring boot yaml的分享已经告一段落,感谢您的关注,如果您想了解更多关于(三) SpringBoot-YAML配置小结、java – Spring Boot中Spring Security的XML配置、java – 使用命令行参数覆盖spring-boot中的yml配置、Spring Boot Yaml配置以获取字符串列表的相关信息,请在本站查询。

本文标签:

上一篇Spring Boot 中的静态资源到底要放在哪里?(spring boot 静态资源路径配置)

下一篇dedecms5.7伪静态如何设置?dede5.7伪静态设置办法七步走(dedecms手机伪静态)