【JavaEE进阶】——要想代码不写死,必须得有spring配置(properties和yml配置文件)

目录

本章目标:

🚩配置文件

🚩SpringBoot配置文件

🎈配置⽂件的格式

🎈 properties 配置⽂件说明

📝properties语法格式

📝读取配置文件

📝properties 缺点分析

🎈yml 配置⽂件说明

📝yml 语法格式

📝yml 使⽤进阶

👩🏻‍💻初始化注解

👩🏻‍💻yml 配置不同数据类型及 null

✅自定义配置

✅单双引号区别

✅yml配置对象

✅yml配置集合

✅yml配置map

✅yml优缺点


本章目标:

配置对象获取用注解@Value

配置集合,map获取用注解@ConfigurationProperties(prefix = "配置名")


🚩配置文件

所谓配置文件,主要就是为了解决硬编码的问题,把可能改变的信息,都放在一起,等到需要改变的时候,直接修改配置文件里面的信息就行了。当我们启动某个程序时, 应⽤程序从配置⽂件中读取数据, 并加载运⾏。

硬编码是将数据直接嵌⼊到程序或其他可执⾏对象的源代码中, 也就是我们常说的"代码写死"
⽐如⼿机字体⼤⼩
如果采⽤硬编码的⽅式, 就直接在程序中指定字体⼤⼩, 所有的⽤⼾使⽤的都是同⼀个字体⼤⼩ ,但是不同的⽤⼾有不同的偏好, 我们可以把⼿机字体的⼤⼩放在配置⽂件中, 当程序启动时, 读取配置, 以⽤⼾设置的字体⼤⼩来显⽰

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


🚩SpringBoot配置文件

SpringBoot⽀持并定义了配置⽂件的格式, 也在另⼀个层⾯达到了规范其他框架集成到SpringBoot的⽬的.
很多项⽬或者框架的配置信息也放在配置⽂件中, ⽐如:
项⽬的启动端⼝
数据库的连接信息(包含⽤⼾名和密码的设置)
第三⽅系统的调⽤密钥等信息
⽤于发现和定位问题的普通⽇志和异常⽇志等
项⽬的启动端⼝
SpringBoot内置了Tomcat服务器, 默认端⼝号是8080, 但是⽤⼾电脑上8080端⼝号有可能就被其他应⽤程序占⽤了, 所以SpringBoot需要⽀持让⽤⼾⾃定义端⼝号。
此时的端口号就是9091,我们在执行spring web的时候,我们就默认的端口号8080就无法连接成功了。

数据库连接信息

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

🎈配置⽂件的格式

Spring Boot 配置⽂件有以下三种:
  • • application.properties
  • • application.yml
  • • application.yaml
yml 为yaml的简写, 实际开发中出现频率最⾼. yaml 和yml 的使⽤⽅式⼀样, 我么现在只讲yml⽂件的使⽤
当应⽤程序启动时, Spring Boot会⾃动从classpath路径找到并加载 application.properties 和 application.yaml 或者 application.yml ⽂件
  • 如果项目中,同时存在properties和yml配置文件,properties的优先级更高。

  • 同时存在时,两个文件都生效
  • 如果两个文件中,都包含同一个配置,以properties为主。

特殊说明
  • 1. 理论上讲 .properties .yml 可以并存在于⼀个项⽬中,当 .properties .yml 并存时,两个配置都会加载. 如果配置⽂件内容有冲突, 则以 .properties 为主, 也就是 .properties 优先级更⾼.
  • 2. 虽然理论上来讲 .properties 可以和 .yml 共存,但实际的业务当中,我们通常会采取⼀种统⼀的配置⽂件格式,这样可以更好的维护(降低故障率)

🎈 properties 配置⽂件说明

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

📝properties语法格式

  • properties语法格式是以键值对的形式存在的
  • key和value之间用=进行连接。
  • key格式是建议小写,单词之间使用.分割
spring.application.name=ioc_demo
#设置端口号
server.port=9091

#连接数据库
  spring.datasource.url=jdbc:mysql://127.0.0.1:3306/testdb?characterEncoding=utf8&useSSL=false
  spring.datasource.username=root
  spring.datasource.password=1005

📝读取配置文件

如果在项⽬中,想要主动的读取配置⽂件中的内容,可以使⽤ @Value 注解来实现。 @Value 注解使⽤" ${} "的格式读取 ,如下代码所⽰:

@RestController
public class propertiesController {
    //读取配置文件的内容
    @Value("${demo.key2}")
    private String key2;
    @RequestMapping("/readKey")
    public String readKey(){
        return "读取到的配置项key2:"+key2;
    }
}


🔴$的作用 

@Value里面的值是字符串,用$修饰的变量,如果去掉$会给""里面的内容都打印出来。此时就获取不到demo.key2对应的value值,而是返回的是字符串里面的值。 


📝properties 缺点分析

properties配置是以key-value进行配置的,从上述的配置中的key可以看出,properties配置文件中会有很多冗余的信息。

想要解决上述的冗余问题,我们就可以使用配置文件的另一个格式了,yml格式。


🎈yml 配置⽂件说明

yml 是 YAML 是缩写,它的全称 Yet Another Markup Language 翻译成中⽂就是“另⼀种标记语⾔.
我们先来学习yml的语法
文件配置的格式有两种,严格的说是三种,但是yml和properties配置文件都可以 ,只是语法格式不同,优先级不同,我们在不同的场景使用哪个配置文件是可供选择的。项目生成之后默认生成的文件配置是properties,但是我们还有另一种标记语言:yml

📝yml 语法格式

  • yml 是树形结构的配置⽂件,它的基础语法是"key: value".(这里红的地方必须有空格,否则语法错误)
  • key 和 value 之间使⽤英⽂冒号加空格的⽅式组成,空格不可省略

第一项有空格是正确的使用方式, key 也是⾼亮显⽰的. 第⼆项没有空格是错误的使⽤⽅式,第⼆项的 key 也没有⾼亮显⽰

使⽤ yml 连接数据库
#配置数据库连接信息
spring:
  datasource:
    url: jdbc:mysql://127.0.0.1:3306/testdb?characterEncoding=utf8&useSSL=false
    username: root
    password: xxxx
yml 和 properties 连接数据库的配置对⽐
yml的格式是树形结构,数据库的连接是基于spring的,然后在datasource,在datasource中获取到url,username,password三个key。

📝yml 使⽤进阶

  👩🏻‍💻初始化注解
@PostConstruct注解可以初始化注解。

👩🏻‍💻yml 配置不同数据类型及 null
✅自定义配置
//配置文件代码
demo1:
  key1: hello,yml
#null表示成null
  key2: ~   
#空字符串表示成'',"",或者可以不写,建议标注一下           
  key3: ''

✅单双引号区别
字符串默认不⽤加上单引号或者双引号, 如果加英⽂的双引号可以表⽰特殊的含义。
尝试在 application.yml 中配置如下信息:
String:
  str1: Hello \n Spring Boot.
  str2: 'Hello \n Spring Boot.'
  str3: "Hello \n Spring Boot."

yml 读取配置的⽅式和 properties 相同,使⽤ @Value 注解即可, 

    //单引号双引号
    @Value("${String.str1}")
    public String str1;
    @Value("${String.str2}")
    public String str2;
    @Value("${String.str3}")
    public String str3;
    

我们从下面图片可以看出,单引号和不加单双引号就表示转义字符,而加上双引号表示的是转义字符对应的表示的意思(换行)。 


从上述结果可以看出:
  • 字符串默认不⽤加上单引号或者双引号。
  • 单引号会转义特殊字符,使其失去特殊功能, 始终是⼀个普通的字符串.
  • 双引号不会转义字符串⾥⾯的特殊字符, 特殊字符会表⽰本⾝的含义.
此处的转义理解起来会有些拗⼝, \n 本意表⽰的是换⾏
  • 使⽤单引号会转义, 就是说, \n 不再表⽰换⾏了, ⽽是表⽰⼀个普通的字符串
  • 使⽤双引号不会转义, 表⽰ \n 表⽰的是它本⾝的含义, 就是换⾏

以后面试官问起的时候,我们可以说在配置文件中,单引号会转义,而双引号不会转义,不会转义就意味着就表达该字符本身的含义,\n表示换行\t表示tab键。


✅yml配置对象
这ji个时候就不能⽤ @Value 来读取配置中的对象了,此时要使⽤另⼀个注解 @ConfigurationProperties 来读取。
@Component 将该类存入到ioc容器中,后续我们需要使用到该类时候,需要注入到某个类的属性中去,用注解 @Autowired

yml配置集合的时候,我们需要通过@ConfigurationProperties进行读取配置中的类,后期在初始化中直接可以sout student即可,因为@Date集成了toString方法。


✅yml配置集合

配置类和配置集合都是需要我们

配置⽂件也可以配置 list 集合,如下所⽰:

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

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

用字符串数组来接收

访问集合的实现如下 


✅yml配置map
配置⽂件也可以配置 map,如下所⽰:

Map的读取和对象⼀样,也是使⽤ @ConfigurationProperties 来读取的,具体实现如下
@Component
@ConfigurationProperties(prefix = "dbtypes")
@Data
public class DBType {
    private HashMap<String,String>map;
}
 @Autowired
    public DBType dbType;
   @PostConstruct
    public void init(){
       System.out.println(dbType.getMap());
}


✅yml优缺点
优点:
  • 1. 可读性⾼,写法简单, 易于理解
  • 2. ⽀持更多的数据类型, 可以简单表达对象, 数组, List,Map等数据形态.
  • 3. ⽀持更多的编程语⾔, 不⽌是Java中可以使⽤, 在Golang, Python, Ruby, JavaScript中也可以使⽤
缺点:
1. 不适合写复杂的配置⽂件
⽐如properties格式如下
keycloak.realm = demo
keycloak.resource = fm-cache-cloud
keycloak.credentials.secret = d4589683-Oce7-4982-bcd3
keycloak.security[0].authRoles[0]= user
keycloak.security[0].collections[0].name = ssologinurl
keycloak.security[0].collections[0].patterns[0] = /login/*
转换为yml
keycloak:
 realm: demo
 resource: fm-cache-cloud
 credentials:
 secret: d4589683-Oce7-4982-bcd3
 security:
 - authRoles:
 - user
 collections:
 - name: ssologinurl
 patterns:
 - /login/*
1
转换的过程也⽐较花费精⼒, 如果配置更复杂⼀点, 可读性会更差, 代码也会更难写

2. 对格式有较强的要求(⼀个空格可能会引起⼀场⾎案


要低调点,让自己的生活变得简单,就是少说自己拥有的东西。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/650823.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

后端经典三层架构

大家好&#xff0c;这里是教授.F 引入&#xff1a; MVC 全称∶ Model 模型、View 视图、 Controller 控制器。MVC 最早出现在 JavaEE 三层中的 Web 层&#xff0c;它可以有效的指导WEB 层的代码如何有效分离&#xff0c;单独工作。 View 视图∶只负责数据和界面的显示&#…

【LeetCode】力扣第 399 场周赛 优质数对的总数 II

文章目录 1. 优质数对的总数 II 1. 优质数对的总数 II 题目链接 &#x1f34e;该题涉及的小技巧&#xff1a;&#x1f425; &#x1f427;①一次可以统计这个数的 两个因子 但是要注意 25 5 * 5&#xff0c;这种情况 5 只能统计一次噢&#x1f192; 解题思路: &#x1f427…

西门子S7-1200加入MRP 环网用法

MRP&#xff08;介质冗余&#xff09;功能概述 SIMATIC 设备采用标准的冗余机制为 MRP&#xff08;介质冗余协议&#xff09;&#xff0c;符合 IEC62439-2 标准&#xff0c;典型重新组态时间为 200ms&#xff0c;每个环网最多支持 50个设备。​博途TIA/WINCC社区VX群 ​博途T…

OrangePi AIpro评测 - 基础操作篇

0. 环境 ●OrangePi AIpro ●win10笔记本 ●路由器 准备下win10电脑、路由器&#xff0c;这些板卡通常是在网络正常的环境下才方便测试。 还要准备OrangePi AIpro的官方资料&#xff1a; http://www.orangepi.cn/html/hardWare/computerAndMicrocontrollers/service-and-suppo…

基于STM32实现智能空气净化系统

目录 引言环境准备智能空气净化系统基础代码示例&#xff1a;实现智能空气净化系统 空气质量传感器数据读取风扇和滤网控制显示系统用户输入和设置应用场景&#xff1a;家庭空气净化与健康管理问题解决方案与优化收尾与总结 1. 引言 本教程将详细介绍如何在STM32嵌入式系统中…

elementui中 表格使用树形数据且固定一列时展开子集移入时背景色不全问题(父级和子级所展示的字段是不一样的时候)

原来的效果 修改后实现效果 解决- 需要修改elementui的依赖包中lib/element-ui.common.js中的源码 将js中此处代码改完下面的代码 watch: {// dont trigger getter of currentRow in getCellClass. see https://jsfiddle.net/oe2b4hqt/// update DOM manually. see https:/…

智慧管廊巡检运维解决方案

一、智慧管廊巡检行业目前存在的挑战和难题 智慧管廊巡检行业面临着运行环境的客观影响&#xff0c;如地面施工、液体渗漏、通风不佳、内部空间受限等问题。而管廊巡检机器人系统的出现却具有重大意义。它能够有力地保障管廊安全且可靠地运行&#xff0c;在面对火情、灾情等紧…

5G专网驻网失败分析(suci无效)

suci 5G终端第一次驻网时&#xff0c;注册消息Registartion request中携带的5GS mobile identity要携带suci类型的mobile identity。 注册消息协议规范见5G NAS 协议3gpp TS24.501 8.2.6 Registration request。 suci协议规范参见3gpp TS24.501 9.11.3.4 5GS mobile identity …

图像处理之计算物体的方向(C++)

图像处理之计算物体的方向&#xff08;C&#xff09; 文章目录 图像处理之计算物体的方向&#xff08;C&#xff09;前言一、PCA获取物体主要方向1.原理2.代码实现 二、Hu矩获取物体主要方向1.原理2.代码实现 总结 前言 在图像处理中&#xff0c;物体的方向&#xff08;倾斜角…

Habicht定理中有关子结式命题3.4.6的证明

个人认为红色区域有问题&#xff0c;因为 deg ⁡ ( ϕ ( S j ) ) r \deg{\left( \phi\left( S_{j} \right) \right) r} deg(ϕ(Sj​))r&#xff0c;当 i ≥ r i \geq r i≥r时&#xff0c; s u b r e s i ( ϕ ( S j 1 ) , ϕ ( S j ) ) subres_{i}\left( \phi(S_{j 1}),\p…

“不是我兄弟”!刘强东内部“狼性训话”流出!

今天&#xff0c;京东创始人刘强东5月24日的线上讲话流出。 在这次线上讲话中&#xff0c;刘强东首先宣布为全体采销员工涨薪20%—100%&#xff0c;随后进行了一番“狼性训话”。往期报道可戳&#xff1a;刘强东怒了&#xff1a;“不是我兄弟”&#xff01; 刘强东在讲话中指…

矩阵对角化在机器学习中的奥秘与应用

在机器学习的广阔领域中&#xff0c;矩阵对角化作为一种重要的数学工具&#xff0c;扮演着不可或缺的角色。从基础的线性代数理论到复杂的机器学习算法&#xff0c;矩阵对角化都在其中发挥着重要的作用。 矩阵对角化的概念与原理 矩阵对角化是矩阵理论中的一个基本概念&#x…

FreeRtos进阶——栈保存现场的几种场景

MCU架构 在认识栈的结构前&#xff0c;我们先来认识以下单片机的简单架构。在我们的CPU中有着很重要的一个模块——寄存器&#xff08;R0-R15&#xff09;&#xff0c;其中R13&#xff0c;R14&#xff0c;R15的别称分别为SP栈顶指针、LR返回地址、PC当前指令地址。外部RAM是单片…

有限元法之有限元空间的构造

目录 一、区域Ω的剖分 二、三角形一次元 三、一次元的基函数与面积坐标 四、三角形二次元及其基函数 前两节我们介绍了有限元基本概念和变分理论的推导&#xff0c;本节我们继续探讨有限元空间的构造。 一、区域Ω的剖分 对矩形区域进行三角剖分&#xff0c;其中x方向剖…

yolov8+ROS+ubuntu18.04——学习记录

参考文献 1.Ubuntu配置Yolov8环境并训练自己的数据集 ROS实时运行 2.https://juejin.cn/post/7313979467965874214 前提&#xff1a; 1.CUDA和Anaconda&#xff0c;PyTorch 2.python>3.8 一、创建激活环境&#xff0c;安装依赖 1.创建虚拟环境 conda create -n yol…

Dream

好像很多人梦寐以求的都是别人已经拥有的&#xff0c;多少人奋斗一生的目标&#xff0c;却只是别人的起点&#xff0c;人生而自由&#xff0c;只是不在枷锁之中&#xff0c;生活中没有人不遗憾&#xff0c;只是没有人喊疼&#xff0c;时间不会重来&#xff0c;已经过去了就让它…

node.js学习P3-P10

P3 npm package.json&#xff08;package解读npm工具换镜像源&#xff09; 一个package.json文件可以的作用 作为一个描述文件&#xff0c;描述了你的项目依赖哪些包 &#xff0c;用来干什么的允许我们使用“语义版本规则”&#xff0c;指明你项目依赖的版本让你的构建更好的…

C++ 数据结构算法 学习笔记(33) -查找算法及企业级应用

C 数据结构算法 学习笔记(33) -查找算法及企业级应用 数组和索引 日常生活中&#xff0c;我们经常会在电话号码簿中查阅“某人”的电话号码&#xff0c;按姓查询或者按字母排 序查询&#xff1b;在字典中查阅“某个词”的读音和含义等等。在这里&#xff0c;“电话号码簿”和…

地信专业大二准备学开发,3大编程语言应该怎么选

地信专业同学学编第一步就是编程语言。 但是编程语言那么多&#xff0c;地信专业需要学什么语言呢&#xff1f;小编在这儿给你介绍三个我们专业常用的编程语言。 01.Python Python 是地理空间分析和一般数据科学中最流行的编程语言之一。它的流行来自于 Python 的高级、人类可…

统信UOS专业版操作系统如何安装惠普打印机驱动

通用集成驱动安装方法 以惠普P1566激光打印机为例介绍一下&#xff0c;在打印机管理器中选择打印机&#xff0c;手动选择安装驱动&#xff0c;找到品牌&#xff1a;惠普&#xff0c;型号&#xff1a;1566&#xff0c;安装驱动后测试打印&#xff1b;LaserJet Pro P1566 Foomati…