springboot学习01-[springboot介绍、配置文件介绍、自动配置读取原理]

springboot介绍、配置文件介绍、自动配置读取原理

  • springBoot学习
    • 代码说明
      • 为什么java -jar springJar包后项目就可以启动
  • 配置文件介绍
    • 配置文件加载顺序
    • 其他约定配置文件加载顺序
    • profile配置文件加载
    • 配置文件绑定类属性
      • 通过@Value的方式进行属性注入
      • 通过@ConfigurationProperties的方式进行属性注入
      • 配置文件占位符
      • 配置文件-属性注入:数据校验
      • 通过@PropertySource可以引入外部properties配置文件
  • Springboot自动配置底层原理

springBoot学习

依赖引入

 <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.target>8</maven.compiler.target>
    <maven.compiler.source>8</maven.compiler.source>
  </properties>

  <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.6.6</version>
  </parent>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>

    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

  </dependencies>

 <!--打包好
  帮我们把所有依赖的jar 统统放到jar文件里面的BOOT-INF\lib中
  设置MANIFEST.MF设置了启动类 .JarLauncher:自定义类加载器加载所有的jar包,调用start-class。从而启动项目
  -->
  <build>
    <plugins>
      <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
      </plugin>
    </plugins>
  </build>

代码说明

所有的springboot都必须继承spring-boot-starter-parent,通过里面的<artifactId>spring-boot-dependencies</artifactId>帮我们管理了依赖的版本

为什么引入了starter后其他依赖也就被引入了?

一个starter也就是启动器,内置了很多的依赖,就相当于一个聚合,引入一个starter也就都引入了

为什么java -jar springJar包后项目就可以启动

  • 先打包
    在这里插入图片描述
    将打的jar包解压可以看到有个BOOT-INF的,里面还有个lib包这个lib包里存的就是项目依赖的其他jar包,叫fat-jar
    在这里插入图片描述
    META-INF中有个MANIFEST.MF文件,里面的Main-Class是所有的jar文件都有的,这个属性会自定义一个类加载器去加载fat-jar中的jar包。然后调用Start-Class去启动项目
    在这里插入图片描述

配置文件介绍

springboot使用一个全局的配置文件 核心配置文件,配置文件名在 约定的情况下 名字是固定的就叫application
配置文件的作用:修改springboot自动配置的默认值;springboot在底层都给我们自动配置好了。比如端口号,springboot默认端口号8080,但是我们可以通过配置文件覆盖默认配置。

配置文件加载顺序

配置文件读取优先级:bootstrap.properties>bootstrap.yml>application.properties>application.yml 优先级大的会覆盖优先级小的

其他约定配置文件加载顺序

1、classpath根目录下
在这里插入图片描述
2、classpath根目录/config
在这里插入图片描述
3、项目根目录
如果当前项目是继承/耦合 关系maven项目的话,项目根目录=父maven项目的根目录。如果是项目只有一个模块那么项目根目录 那就是当前模块的根目录
在这里插入图片描述
4、项目根目录 /config
如果当前项目是继承/耦合 关系maven项目的话,项目根目录=父maven项目的根目录 /config。如果是项目只有一个模块那么项目根目录 那就是当前模块的根目录 /config
在这里插入图片描述
优先级由上到下,由低到高

profile配置文件加载

多环境配置配置文件
profile文件命名规则:application-名称.yml
在这里插入图片描述

  • 在applicaction.yml中进行激活
spring:
  profiles:
    active: dev

配置文件绑定类属性

  • 定义实体bean
@Data
@ToString
public class User {
    private String username;
    private Integer age;
    private Date birthday;
    private List<String> hobbies;
    private Map<Integer,String> girlFriend;
    private Address address;
}

@Data
public class Address {
    private Integer id;
    private String detailAddress;
}
  • 定义yml文件
user:
  username: zzq
  age: 25

通过@Value的方式进行属性注入

@Data
@ToString
@Component
public class User {

    @Value("${user.username}")
    private String username;

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

    private Date birthday;
    private List<String> hobbies;
    private Map<Integer,String> girlFriend;
    private Address address;
}
  • 测试
@SpringBootTest(classes = MyApplication.class)
public class Test {

    @Autowired
    private User user;

    @org.junit.jupiter.api.Test
    public void test(){
        System.out.println(user);
    }
}

在这里插入图片描述

通过@ConfigurationProperties的方式进行属性注入

@Data
@ToString
@Component
@ConfigurationProperties(prefix = "user")
public class User {
    private String username;
    private Integer age;
    private Date birthday;
    private List<String> hobbies;
    private Map<Integer,String> girlFriend;
    private Address address;
}
  • 测试
@SpringBootTest(classes = MyApplication.class)
public class Test {

    @Autowired
    private User user;

    @org.junit.jupiter.api.Test
    public void test(){
        System.out.println(user);
    }
}

在这里插入图片描述
@ConfigurationProperties:常用于bean属性和yml配置文件的绑定。prefix:可以指定配置文件中某一个节点,该节点中的子节点将自动和属性进行绑定
此外@ConfigurationProperties还支持松散绑定
在这里插入图片描述
@value和@ConfigurationProperties区别,最大的一个区别就是@ConfigurationProperties可以匹配多个,@value需要一个一个去匹配,比较麻烦

  • 我们目前写yml文件没有提示,如果需要提示需要引入spring-boot-configuration-processor依赖
    这个依赖会生成METE-INFO 元数据 用于提供idea自动提示配置文件的
     <!--这个依赖会生成METE-INFO 元数据 用于提供idea自动提示配置文件的-->
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-configuration-processor</artifactId>
      <!--依赖不会传播 如果这是个父模块,子模块不会继承这个依赖-->
      <optional>true</optional>
    </dependency>
  • 如果想要自动提示还需要修改idea相关配置
    在这里插入图片描述
    生成的元数据-用于自动提示
    在这里插入图片描述
  • 补充完剩余的属性
  • list类型
  hobbies:
    - 唱歌
    - 跳舞
    - 打篮球
   hobbies: [唱歌、跳舞、打篮球]

在这里插入图片描述

  • map的类型
  girl-friend:
    18: 范冰冰
    19: 刘亦菲
  girl-friend: {18:范冰冰,19:刘亦菲}

在这里插入图片描述

  • 嵌套对象
  address:
    id: 5
    detailAddress: 6666
  • 完整配置
user:
  username: zzq
  age: 123
  birthday: 2020/01/01
  hobbies:
    - 唱歌
    - 跳舞
    - 打篮球
  girl-friend: {18:范冰冰,19:刘亦菲}
  address:
    id: 6
    detailAddress: 6666

配置文件占位符

可以通过${}来引用其他的配置项,这就是配置文件占位符,${}还可以引用springboot内置的一些属性,比如random.uuid

user:
  username: zzq
  age: 123
  birthday: 2020/01/01
  hobbies:
    - 唱歌
    - 跳舞
    - 打篮球
  girl-friend: {18:范冰冰,19:刘亦菲}
  address:
    id: 6
    detailAddress: ${user.username}的家

id: ${random.int}

user:
  username: zzq
  age: 123
  birthday: 2020/01/01
  hobbies:
    - 唱歌
    - 跳舞
    - 打篮球
  girl-friend: {18:范冰冰,19:刘亦菲}
  address:
    id: ${random.int}
    detailAddress: ${user.username}的家

配置文件-属性注入:数据校验

只支持@ConfigurationProperties,在使用的时候只需要加@Validated(支持对jsr-303数据校验)

  • jsr-303数据校验
    在这里插入图片描述
    要支持对jsr-303数据校验还需要加入一个数据校验的场景启动器
 <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-validation</artifactId>
    </dependency>
  • 测试 -实体bean要测试的属性加上注解
@Data
@ToString
@Component
@ConfigurationProperties(prefix = "user")
@Validated
public class User {
    private String username;
    private Integer age;
    private Date birthday;
    private List<String> hobbies;
    private Map<Integer,String> girlFriend;

    @NotNull
    private Address address;
}
  • 配置文件配置-去掉address不让能够注入
user:
  username: zzq
  age: 123
  birthday: 2020/01/01
  hobbies:
    - 唱歌
    - 跳舞
    - 打篮球
  girl-friend: {18:范冰冰,19:刘亦菲}

结果在这里插入图片描述

通过@PropertySource可以引入外部properties配置文件

  • properties配置
    在这里插入图片描述
user.username=zzq
user.age=123
user.birthday=2020/02/06
user.hobbies=[跳舞、唱歌]
user.girlFriend.18=范冰冰
user.girlFriend.19=刘亦菲
user.address.id=5
user.address.detailAddress=上海
  • 实体bean配置-@PropertySource(“classpath:data/user.properties”)
@Data
@ToString
@Component
@ConfigurationProperties(prefix = "user")
@Validated
@PropertySource("classpath:data/user.properties")
public class User {
    private String username;
    private Integer age;
    private Date birthday;
    private List<String> hobbies;
    private Map<Integer,String> girlFriend;
    private Address address;
}

Springboot自动配置底层原理

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

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

相关文章

python爬虫学习笔记一(基本概念urllib基础)

学习资料&#xff1a;尚硅谷_爬虫 学习环境: pycharm 一.爬虫基本概念 爬虫定义 > 解释1&#xff1a;通过程序&#xff0c;根据URL进行爬取网页&#xff0c;获取有用信息 > 解释2&#xff1a;使用程序模拟浏览器&#xff0c;向服务器发送请求&#xff0c;获取相应信息…

如何设置Excel单元格下拉列表

如何设置Excel单元格下拉列表 在Excel中设置单元格下拉列表可以提高数据输入的准确性和效率。以下是创建下拉列表的步骤&#xff1a; 使用数据验证设置下拉列表&#xff1a; 1. 选择单元格&#xff1a; 选择你想要设置下拉列表的单元格或单元格区域。 2. 打开数据验证&…

Emacs之实现目录替换(一百四十三)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

2024年P气瓶充装证模拟考试题库及P气瓶充装理论考试试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年P气瓶充装证模拟考试题库及P气瓶充装理论考试试题是由安全生产模拟考试一点通提供&#xff0c;P气瓶充装证模拟考试题库是根据P气瓶充装最新版教材&#xff0c;P气瓶充装大纲整理而成&#xff08;含2024年P气瓶…

yolov8训练初体验

最近在爬一些数据&#xff0c;有些网址的验证码比较难搞&#xff0c;于是使用yolov8来解决。 一、数据打标签并转为txt 使用的软件为X-AnyLabeling。内置各种模型&#xff0c;方便打标。 打标完成后由于是json格式&#xff0c;所以我们使用python转换即可 import json import…

2024各省自考报名时间汇总❗所需材料❗

天津&#xff1a;5月27日-5月31日&#xff08;已结束&#xff09; 河北&#xff1a;6月10日~6月15日&#xff08;已结束&#xff09; 贵州&#xff1a;6月17日~26日 山东&#xff1a;6月18日~6月24日 江西&#xff1a;6月26日-7月7日&#xff08;6月下旬&#xff09; 浙江&…

【Liunx-后端开发软件安装】Liunx安装FDFS并整合nginx

【Liunx-后端开发软件安装】Liunx安装nacos 文章中涉及的相关fdfs相关软件安装包请点击下载&#xff1a; https://download.csdn.net/download/weixin_49051190/89471122 一、简介 FastDFS是一个开源的轻量级分布式文件系统&#xff0c;它对文件进行管理&#xff0c;功能包括…

详解互联网基石之HTTPS

一、HTTPS简介 HTTPS&#xff08;HyperText Transfer Protocol Secure&#xff09;是一种用于安全通信的网络传输协议。它是HTTP的加密版本&#xff0c;通过使用TLS&#xff08;Transport Layer Security&#xff09;或其前身SSL&#xff08;Secure Sockets Layer&#xff09;来…

我不太建议大家早睡!

自从我早晨5点开始睡&#xff0c;这身体是越来越差了...... 开个玩笑&#xff5e;&#xff5e; 大家好&#xff0c;我是前端队长&#xff0c; 自从上次科学减脂挑战完毕&#xff0c;我一个月瘦了6.4斤&#xff0c;我还是挺满意的&#xff0c; 唯一不开心的是&#xff0c;我这样…

vscode配置vue格式化代码不管用

所有配置都配好了就是无法使用自己想要的vetur格式化代码 后台发现调整默认格式化代码的顺序就可以&#xff0c; 修改该后就可以了

[面试题]MongoDB

[面试题]Java【基础】[面试题]Java【虚拟机】[面试题]Java【并发】[面试题]Java【集合】[面试题]MySQL[面试题]Maven[面试题]Spring Boot[面试题]Spring Cloud[面试题]Spring MVC[面试题]Spring[面试题]MyBatis[面试题]Nginx[面试题]缓存[面试题]Redis[面试题]消息队列[面试题]…

AI时代的音乐革命:创作更简单,灵魂在哪里?

#AI在创造还是毁掉音乐# 我是李涛&#xff0c;一名音乐创作者&#xff0c;最近一直在思考一个问题&#xff1a;AI到底是在创造音乐&#xff0c;还是在毁掉音乐&#xff1f; 几个月前&#xff0c;我第一次接触到AI音乐创作工具。它让我震惊&#xff0c;只需要输入几个关键词&a…

【Android面试八股文】自定义View执行invalidate()方法为什么有时候不会回调onDraw()?

文章目录 一、自定义View执行invalidate()方法为什么有时候不会回调onDraw()?1.1 invalidate 软件绘制流程1.2 invalidate源码分析1.2.1 skipInvalidate()方法1.2.2 invalidateChild方法1.2.2.1 硬件加速绘制1.2.2.2 软件刷新1.2.3 小结一、自定义View执行invalidate()方法为什…

论文《Universal Graph Convolutional Networks》笔记

【UGCN】论文提出一个基本问题&#xff0c;即是否不同的网络结构属性应该采用不同的传播机制。通过实验发现&#xff0c;对于完全同配性、完全异配性和随机性的网络&#xff0c;1-hop、2-hop和k-nearest neighbor&#xff08;kNN&#xff09;邻居分别更适合作为信息传播的邻域。…

怎么优化ArcEngine组件开发mfc程序界面?

&#x1f3c6;本文收录于「Bug调优」专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收藏&&…

【Linux详解】缓冲区优化 | 进度条的实现 | Linux下git 的上传

目录 一. 缓冲区 1. 缓冲区概念 2. 缓冲区作用 2.1 提升读写效率 2.2 减少等待时间 3. 缓冲区刷新策略 3.4 特殊策略 4. 缓冲区存储位置 5. 总结 二. 实现进度条 引入&#xff1a;倒计时 process.c 三. Linux下git的上传 sum 一. 缓冲区 1. 缓冲区概念 缓冲区是…

数据库设计文档编写

PS&#xff1a;建议使用第三种方法 方法1&#xff1a;使用 Navicat 生成数据库设计文档 效果 先看简单的效果图&#xff0c;如果效果合适&#xff0c;大家在进行测试使用&#xff0c;不合适直接撤退&#xff0c;也不浪费时间。 随后在docx文档中生成目标字段的表格&#xf…

【必看】每个开发人员都应该知道的 10 个 GitHub 库

GitHub&#x1f31f;&#xff1a;155K 被难题困住了&#xff1f;还是需要一些建议来指导你进入开发者行业&#xff1f;这个 仓库 将为你提供帮助。它拥有想要成为前端、后端或 DevOps 工程师需要的所有技术。你可以选择符合需求的或适合自己的&#xff0c;因为它提供了多种多…

npm全局安装依赖指定存放文件目录

引言 学校机房&#xff0c;每次默认在c盘装完 电脑关机重启都得重新安装&#xff0c;十分麻烦 1-创建依赖安装/缓存目录 2-打开终端输入设置安装目录位置的命令 npm set cache \你创建的缓存文件目录\ npm set prefix \你创建的global全局安装依赖文件目录\至此以后npm -g 依…

ChatGPT-4o也参加高考了,还写了六大考卷的全部作文! |【WeThinkIn出品】

写在前面 【WeThinkIn出品】栏目专注于分享Rocky的最新思考与经验总结&#xff0c;包含但不限于技术领域。欢迎大家一起交流学习&#x1f4aa; 欢迎大家关注Rocky的公众号&#xff1a;WeThinkIn 欢迎大家关注Rocky的知乎&#xff1a;Rocky Ding AIGC算法工程师面试面经秘籍分享…