【JavaEE进阶】 SpringBoot配置?件

发布时间:2024年01月20日

🍀配置?件的作?

计算机上有数以千计的配置?件,我们使?的绝?多数软件,?如浏览器,微信,Idea,甚?电脑,?机,都离不开配置?件.

我们可能永远不会直接与其中的?部分?件打交道,但它们确实以不同的形式散落在我们的计算机上,?如C:\Users,C:\Windows?件夹,以及各种*.config,*.xml?件

配置?件主要是为了解决硬编码带来的问题,把可能会发?改变的信息,放在?个集中的地?,当我们启动某个程序时,应?程序从配置?件中读取数据,并加载运?.

硬编码是将数据直接嵌?到程序或其他可执?对象的源代码中,也就是我们常说的"代码写死".

?如?机字体?? 如果采?硬编码的?式,就直接在程序中指定字体??,所有的??使?的都是同?个字体??

但是不同的??有不同的偏好,我们可以把?机字体的??放在配置?件中,当程序启动时,读取配置,以??设置的字体??来显?.

使?配置?件,可以使程序完成??和应?程序的交互,或者应?程序与其他应?程序的交互

🌴SpringBoot配置?件

SpringBoot?持并定义了配置?件的格式,也在另?个层?达到了规范其他框架集成到SpringBoot的?的.

很多项?或者框架的配置信息也放在配置?件中,?如:

  • 项?的启动端

  • 数据库的连接信息(包含??名和密码的设置)

  • 第三?系统的调?密钥等信息

  • ?于发现和定位问题的普通?志和异常?志等.

对于项?的启动端?
SpringBoot内置了Tomcat服务器,默认端?号是8080,但是??电脑上8080端?号有可能就被其他
应?程序占?了,所以SpringBoot需要?持让???定义端?号

而对于数据库连接信息
为了更?便简单的访问数据库,出现了?些持久层框架,其实就是对JDBC进?了更深层次的封装.让??通过简单??代码就可完成数据库的访问.但是不同的应?程序访问的数据库不同,这些持久层框架就需要?持??可以?定义配置数据库的连接信息

接下来我们先简单配置看一下:

我们在前?讲了Tocmat默认端?号是8080,所以我们程序访问时的端?号也是8080,但是如果8080端?号已经被其他进程使?了呢?我们可以通过配置?件来修改服务的端?号,SpringBoot在创建项?时,就已经帮我们创建了配置?件
在这里插入图片描述
修改 application.properties ?件

server.port=9090

再次启动,我们观察日志中tomcat所用端口

在这里插入图片描述

显?Tomcat启动端?号为9090

🎋配置?件的格式

SpringBoot配置?件有以下三种:

  • application.properties

  • application.yml

  • application.yaml

yml为yaml的简写,实际开发中出现频率最?.yaml和yml的使??式?样,博主这里只讲yml?件的使?

当应?程序启动时,SpringBoot会?动从classpath路径找到并加载application.properties 和application.yaml 或者 application.yml ?件

也可以通过spring.config.name指定?件路径和名称,参考链接点我

在这里插入图片描述

那么如何理解这两种配置文件的区别呢?

类似商品的包装?样,有新?两款包装.properties类型的配置?件就属于?款包装,也是创建SpringBoot项?时默认的?件格式(主要是因为仓库?还有库存),?yml属于新版包装,如果??了解情况直接指定要新款包装,那么就直接发给他

当然这里还有一些特殊情况需要说明:

  1. 理论上讲 .properties 和 .yml 可以并存在于?个项?中,当 .properties 和 .yml 并存时,两个配置都会加载.如果配置?件内容有冲突,则以 .properties 为主,也就是.properties 优先级更?.

  2. 虽然理论上来讲 .properties 可以和 .yml 共存,但实际的业务当中,我们通常会采取?种统?的配置?件格式,这样可以更好的维护(降低故障率).

🎄properties配置?件

properties配置?件是最早期的配置?件格式,也是创建SpringBoot项?默认的配置?件

🚩properties基本语法

properties是以键值的形式配置的,key和value之间是以"="连接的,如:

# 配置项?端?号
server.port=8080
  #配置数据库连接信息
spring.datasource.url=jdbc:mysql://127.0.0.0:3306/dbname?characterEncoding=utf8&useSSL=false
spring.datasource.username=root
spring.datasource.password=root

想要了解更多配置的小伙伴可以参考 SpringBoot配置

🚩读取配置?件

如果在项?中,想要主动的读取配置?件中的内容,可以使? @Value 注解来实现。

@Value 注解使?" ${} "的格式读取,如下代码所?:

获取properties 配置如下:

@RestController
public class PropertiesController {
    @Value("${server.port}")
    private String value;
    @RequestMapping("/getValue")
    public String getValue() {
        return "端口号为:"+value;
    }
}

获取如下:

在这里插入图片描述

🚩properties的缺点

properties配置是以key-value的形式配置的,如下图所示
在这里插入图片描述

从上述配置key看出,properties配置?件中会有很多的冗余的信息,?如这些:

在这里插入图片描述

想要解决这个问题,就可以使?yml配置?件的格式化了.

🌳yml配置?件

yml是YAML是缩写,它的全称Yet Another Markup Language翻译成中?就是“另?种标记语?.

yml基本语法

yml是树形结构的配置?件,它的基础语法是"key: value".

key和value之间使?英?冒号加空格的?式组成,空格不可省略
在这里插入图片描述

我们刚刚也说过了,yml可以解决properties配置?件冗余信息的问题。接下来我们就以数据库为例,看一下yml是如何解决的,yml配置文件如下:

spring:
 datasource:
  url: jdbc:mysql://127.0.0.0:3306/dbname?characterEncoding=utf8&useSSL=false
  username: root
  password: root

使用注意事项:

  • properties用 . 将每一层文件分开,yml每一层结束后用 :分开。并且需要换行(当然也可以使用 . )
  • 换行前面空余部分是一个空格(相较于上一行)而不是一个tab

接下来我们看一看两者的代码量的对比,对比如下:

在这里插入图片描述

🚩yml 使?进阶

🎈yml配置不同数据类型及null

# 字符串
string.value: Hello
# 布尔值,truefalse
boolean.value: true
boolean.value1: false
# 整数
int.value: 10
# 浮点数
float.value: 3.14159
# Null~代表null
null.value: ~
# "" 空字符串
#, 直接后?什么都不加就可以了, 但这种?式不直观, 更多的表?是使?引号括起来
empty.value: ''
📌yml配置读取

yml读取配置的?式和properties相同,使?@Value注解即可,实现代码如下:

@RestController
public class YmlController {
    @Value("${string.value}")
    private String say;
    @RequestMapping("/getSay")
    public String getSay() {
        return "say:"+say;
    }
}

读取结果如下:
在这里插入图片描述

📌注意事项:value值加单双引号

字符串默认不?加上单引号或者双引号,如果加英?的单双引号可以表?特殊的含义。
尝试在application.yml中配置如下信息:

string:
 str1: Hello \n 遇事问春风乄.
 str2: 'Hello \n 遇事问春风乄.'
 str3: "Hello \n 遇事问春风乄."

获取配置文件代码如下:

@RestController
public class HelloController {
    @Value("${string.str1}")
    private String hello1;
    @Value("${string.str2}")
    private String hello2;
    @Value("${string.str3}")
    private String hello3;
    @RequestMapping("/getHello")
    public String getHello() {
        System.out.println("str1:" + hello1);
        System.out.println("str2:" + hello2);
        System.out.println("str3:" + hello3);
        return "ok";
    }
}

执行结果如下:

在这里插入图片描述

从上述结果可以看出:

  • 字符串默认不?加上单引号或者双引号。

  • 单引号会转义特殊字符,使其失去特殊功能,始终是?个普通的字符串.

  • 双引号不会转义字符串??的特殊字符,特殊字符会表?本?的含义.

此处的转义理解起来会有些拗?,\n本意表?的是换?
使?单引号会转义,就是说,\n不再表?换?了,?是表??个普通的字符串
使?双引号不会转义,表?\n表?的是它本?的含义,就是换?

当然每个人理解不同,意思也就不同

🎈配置对象

我们还可以在yml中配置对象,如下配置:

student:
 id: 1
 name: 遇事问春风乄
 age: 18

或者是使??内写法(与上?的写法作??致):

student: {id: 1,name: Java,age: 18}

这个时候就不能?@Value来读取配置中的对象了,此时要使?另?个注解

@ConfigurationProperties 来读取,具体实现如下

@ConfigurationProperties(prefix = "studnet")
@Component
@Data
public class Student {
    private int id;
    private String name;
    private int age;
}

这个注解的意思是个读取了配置文件里面的对象

读取代码如下:

@RestController
public class StudentController {

    @Autowired
    private Student student;
    @RequestMapping("/readStudent")
    public String readStudent(){
        return student.toString();
    }
}

在这里插入图片描述

🎈配置集合

配置?件也可以配置list集合,如下所?

集合的读取和对象?样,也是使? @ConfigurationProperties 来读取的,具体实现如下:

@Component
@ConfigurationProperties("dbtypes")
@Data
public class ListConfig {
    private List<String> name;
}

访问集合如下:

@RestController
public class ReadYm {
    @Autowired
    private ListConfig listConfig;
    @RequestMapping("/readList")
    public String readList(){
        return listConfig.toString();
    }
}

在这里插入图片描述

注意事项:

在这里插入图片描述

🎈配置Map

配置?件也可以配置map,如下所?:

maptypes:
 map:
  k1: kk1
  k2: kk2
  k3: kk

或者是使??内写法(与上?的写法作??致):

maptypes: {map: {k1: kk1,k2: kk2, k3: kk3}}

Map的读取和对象?样,也是使? @ConfigurationProperties 来读取的,具体实现如下

@Component
@ConfigurationProperties("maptypes")
@Data
public class MapConfig {
    private HashMap<String,String> map;
}

访问map如下:

@RestController
public class ReadYml {
    @Autowired
    private MapConfig mapConfig;
    @RequestMapping("/readMap")
    public String readStudent(){
        return mapConfig.toString();
    }
}

在这里插入图片描述

🚩yml优缺点

优点:

  1. 可读性?,写法简单,易于理解

  2. ?持更多的数据类型,可以简单表达对象,数组,List,Map等数据形态.

  3. ?持更多的编程语?,不?是Java中可以使?,在Golang,Python,Ruby,JavaScript中也可以使?

缺点:

  1. 不适合写复杂的配置?件

  2. 对格式有较强要求

?总结

关于《【JavaEE进阶】 SpringBoot配置?件》就讲解到这儿,感谢大家的支持,欢迎各位留言交流以及批评指正,如果文章对您有帮助或者觉得作者写的还不错可以点一下关注,点赞,收藏支持一下!

文章来源:https://blog.csdn.net/m0_71731682/article/details/135706283
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。