我们都知道在Spring中有着application.xml文件对Spring进行相关配置,通过web.xml中的contextConfigLocation指定application.xml文件所在位置进行Spring核心配置,那么在SpringBoot中是怎么实现的呢?SpringBoot核心配置文件的名字是已经规定好的,文件名称是application.properties或application.yml,文件目录默认在/src/main/resources路径下。下面看一下xml和yml在写法中有什么区别。

    xml写法

<beans>
    <bean id="xxx" class="xxx"></bean>
</beans>

 yml写法

person:
    name: jane
    age: 15
    birth: 2005/12/03
    bool: true
    maps: {k1: v1,k2: v2} 
    lists: 
       - bob
       - jane

 

    上面是yml的具体写法,但是要强调一下,yml中有几点是必须注意的

    1:k:(空格)v: 表示键值对(空格必须有)

    2:以空格缩进来控制成绩关系:只要是左对齐的数据都是同一层级的

    3:属性和值大小写敏感

    4:k:v直接写 字符串默认不需要加单引号和双引号,单引号会转义特殊字符,双引号不会转义特殊字符。

    既然已经知道具体写法了,那么SpringBoot是如何获取配置文件中的值呢?先来说一下获取yml中值得方法。

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

    这里要说明下为什么要在pom.xml中引入这个依赖,由于SpringBoot在获取yml中的数据时需要使用@ConfigurationProperties注解,所以需要添加上面的依赖。

    javaBean

@ConfigurationProperties(prefix ="person")
//告诉springboot将本类中所有的属性和配置文件中相关配置进行绑定
@Configuration
@Component
public class Person {
    
    private String name;
    
    private Integer age;
    
    private Boolean bool;
    
    private Date birth;
    
    private Map<String,Object> maps;
    
    private List<Object> lists;

    测试

@Controller
public class HelloController {
    
    @Autowired
    Person person;
    
    @ResponseBody
    @RequestMapping("/hello")    
    public String Hello(){
        System.out.println(person);
        return "Hello World";
    }
}

    请求结果

spring cloud中yml文件怎么引入redis spring application.yml_配置文件

 

 

     这里可以看到已经获取到yml中的属性值。

     下面说一下如何获取properties文件中的属性值

     properties

person.name=jane
person.age=15
person.birth= 2005/12/03
person.bool=true

    javaBean

@Configuration
@Component
public class Person {
    
    @Value("${person.name}")
    private String name;
    
    @Value("${person.age}")
    private Integer age;
    
    @Value("${person.bool}")
    private Boolean bool;
    
    @Value("${person.birth}")
    private Date birth;

    请求结果

spring cloud中yml文件怎么引入redis spring application.yml_xml_02

 

 

     相信已经有人看到我在yml中是有获取map和list的但是在properties中却没有,这就是yml和properties相比较最重要的一个区别,yml支持复杂类型封装而properties不支持

     下面说一下@ConfigurationProperties注解和@value注解得区别

 

ConfigurationProperties

value

功能

批量注入

单个注入

松散语法绑定

支持 

不支持

spEL

不支持

支持

JSR303数据校验

支持

不支持

复杂类型封装

支持

 不支持  (maps,lists)

    虽然SpringBoot中为我们提供了application.xml/properties配置文件,但是当我们项目中遇到很多类都需要进行配置的话该怎么办呢,总不能把所有的属性都写在一个配置文件中吧,

所以下面说一下如何自定义yml/properties配置文件目录。SpringBoot为我们提供了俩个注解@PropertySource和@ImportResource。

    这里需要注意的是@PropertySource用来导入yml和properties文件,而@ImportResource用来导入外部的xml文件,由于我使用@ImportResource导入yml时遇到如下错误

    javaBean

@ConfigurationProperties(prefix ="person")
@ImportResource("classpath:/config/person.yml")
//告诉springboot将本类中所有的属性和配置文件中相关配置进行绑定
@Configuration
@Component
public class Person {
    
    private String name;
    
    private Integer age;
    
    private Boolean bool;
    
    private Date birth;
    
    private Map<String,Object> maps;
    
    private List<Object> lists;

    启动时报错

spring cloud中yml文件怎么引入redis spring application.yml_spring_03

 

     前言中不允许有空内容,然后我就去百度翻阅了很多内容,有一个博主也遇到相同的问题,他也在网上翻阅了很多资料发现很多人可能都是复制粘贴的,解决的办法都是就是用notePad方式打开文件,然后保存为 UTF-8 with no BOM 的方式。但是我经过尝试发现还是不行。下面看一下使用@PropertySource注解

    javaBean

ConfigurationProperties(prefix ="person")
@PropertySource("classpath:/config/person.yml")
//告诉springboot将本类中所有的属性和配置文件中相关配置进行绑定
@Configuration
@Component
public class Person {
    
    private String name;
    
    private Integer age;
    
    private Boolean bool;
    
    private Date birth;
    
    private Map<String,Object> maps;
    
    private List<Object> lists;

    目录结构

spring cloud中yml文件怎么引入redis spring application.yml_配置文件_04

 

 运行结果

spring cloud中yml文件怎么引入redis spring application.yml_spring_05

 

     可以看到没有问题,同理获取properties也是一样的,这里就不过多举例了。

在很长的一段时间我变的颓废混日子,甚至忘了当初选择这个行业的初衷,总是喜欢抱怨种种得不公,我希望以后的日子我能找回那个努力的自己,没有人愿意平平淡淡,碌碌无为过一生,不求无愧于他人,但求无愧于自己,也希望每个在这个行业里为之坚持的伙伴我们都能无愧于自己,成为那个想象中的自己。