Spring Boot:Spring Boot 入门、yaml 配置文件给属性赋值、自动装配原理详解

文章目录

  • Spring Boot - 01
  • 一、概述
  • 二、第一个 Spring Boot 程序
    • 补充知识
  • 三、配置文件
    • 1. yaml 配置文件
    • 2. 使用 yaml 配置文件给属性赋值
    • 3. 松散绑定以及数据校验
    • 4. 配置文件的位置以及多环境配置
  • 四、Spring Boot 分析
    • 1. pom.xml
    • 2. 启动器
    • 3. 主程序
    • 4. 自动装配原理
    • 5. 主启动类运行
  • 注意:

Spring Boot - 01

Spring Boot 官网:点此进入


一、概述

  1. Spring Boot 核心思想:约定大于配置;

  2. Spring Boot 的主要优点

    • 为所有 Spring 开发者更快地入门;
    • 开箱即用,提供各种默认配置来简化项目配置;
    • 内嵌式容器简化 Web 项目;
    • 没有冗余代码生成和 XML 配置的要求。
  3. 单体应用架构(all in one)

    • 是指一个应用中的所有功能单元都封装在一个应用中,例如将数据库访问、Web 访问等各个功能都放到一个 war 包内;
    • 优点:易于开发和测试,方便部署,当需要扩展时,将 war 包复制多份,然后放在多个服务器上,再做个负载均衡即可;
    • 缺点:如果要修改某处,必须停掉整个服务,重新打包部署,并且对于大型应用,不可能把所有内容都放在一个应用中。
  4. 微服务架构

    • 把每个功能元素独立出来,然后将独立的功能元素动态组合,微服务架构是对功能元素进行复制,而没有对整个应用进行复制;
    • 优点:节省了调用资源,并且每个功能元素都是一个可替换的、可独立升级的软件代码(高内聚,低耦合)。

  1. 微服务的具体阐述,中文翻译:点此进入;
  2. 微服务架构中,各个功能元素完成自己的功能,然后通过 http 相互请求调用。例如一个电商系统中,查缓存、连接数据库、结账、支付等服务都是一个个独立的功能元素,它们作为一个个微服务共同构建了一个庞大的系统,如果要修改其中的一个功能,只需要升级其中一个功能服务单元即可;
  3. Spring 为构建实现微服务,提供了从构建应用单元到完成大型分布式应用的方案
    • 使用 Spring Boot 可以构建一个个功能独立的微服务应用单元
    • 使用 Spring Cloud 可以实现分布式,完成大型分布式网络服务的调用;
    • 使用 Spring Cloud Data Flow 可以在分布式中间进行流式数据计算批处理等。

二、第一个 Spring Boot 程序

步骤

运行报错的情况

  1. 如果运行报错:类文件具有错误的版本 61.0,应为 52.0,此时需要在 pom.xml 中降低 Spring Boot 的版本,这里降为 2.7.12;

  2. 如果运行报错:java 无效的目标发行版:17,此时需要修改两个地方,如图所示:

    • 打开 Settings 设置,修改 Java 编译器的版本为 1.8;
    • 打开项目结构,修改 Sources 和 Dependencies 为 1.8。

运行成功,并添加 controller 文件夹

说明

  1. 程序主入口所在的类由注解 @SpringBootApplication 声明,查看源码,发现该类是 Spring 的一个组件(@Component);
  2. controller 包一定要与程序主入口所在的类在同级目录;
  3. Spring Boot 使用 Tomcat 作为默认嵌入式容器
  4. 通过查看 pom.xml 文件,可以看到有一个父项目:spring-boot-starter-parent;
  5. 所有的 Spring Boot 依赖都是以 spring-boot-starter 开头的:
    • spring-boot-starter-web 依赖:包含了 SpringMVC,用于实现 http 接口;
    • spring-boot-starter-test 依赖:用于编写单元测试。

补充知识

  • 修改端口号,可以在 Spring Boot 的核心配置文件 application.properties 中配置:
# 修改端口号
server.port=8081
  • 自定义启动 Banner,在线生成工具:点此进入,在 resources 包下新建 banner.txt,将 Banner 粘贴到文件中。


三、配置文件

Spring Boot 使用一个全局的配置文件,配置文件名称是固定的,为:application,而文件类型可以为 properties 或 yaml。

配置文件的作用:修改 Spring Boot 自动配置的默认值。

1. yaml 配置文件

yaml 是一个可读性高,用来表达数据序列化的格式

yaml 语法结构:key : (空格) value,注意:一定要有空格!

# 普通的键值对
name: Sun3285# 对象
student: name: Sun3285age: 24student1: {name: Sun3285, age: 24}  # 行内写法# 数组
teacher: - 小张- 小明teacher1: [小张, 小明]  # 行内写法

注意

  1. 字符串不一定要用双引号标识;
  2. 在缩排中空白字符的数目并不是非常重要,只要相同阶层的元素左侧对齐就可以(注意不能使用 Tab 字符);
  3. 允许选择性加入空行,以增加可读性;
  4. 在 yaml 中可以使用缩写语法行内写法):
    • 数组(一组按次序排列的值)用 [] 包括起来;
    • 对象(键值对的集合)用 {} 包括起来。

2. 使用 yaml 配置文件给属性赋值

  • 之前:在 Spring 的 xml 配置文件中,注册 bean,然后通过依赖注入给属性赋值;

  • 现在:在类上加注解注册为 bean,简单属性可以使用注解 @Value 实现自动装配,复杂类型的属性可以使用 yaml 配置文件赋值。

实践:在程序主入口所在类的同级目录中,新建 pojo 包,建立 Dog 类和 Person 类。

使用 yaml 配置文件给属性赋值,并在 Java 类上使用注解 @ConfigurationProperties(prefix = "xxx") 声明

测试及结果

注意点

  • 键的名称不要有中文;

  • 在给对象属性赋值时,如果既使用了注解 @Autowired 自动装配,又使用了 yaml 配置文件赋值,最终会以 yaml 配置文件赋值

  • 使用注解 @ConfigurationProperties 的前提:这个类被注册,成为容器中的组件;

  • 在使用注解 @ConfigurationProperties 时,会有以下提示。解决办法:在 pom.xml 中添加以下依赖;

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-configuration-processor</artifactId><optional>true</optional>
</dependency>
  • 测试发现布尔类型的属性赋值为 null:
    • 原因:在自动生成 set 方法时,方法名为 setHappy ,而 yaml 配置文件中键名为 isHappy ,两者不一致;
    • 改正方法:修改 set 方法的方法名为 setIsHappy 修改 yaml 配置文件中键名为 happy ,使两者一致;
    • 可以发现:使用 yaml 配置文件给属性赋值的本质也是根据 set 方法来实现依赖注入

3. 松散绑定以及数据校验

松散绑定:yaml 配置文件中的键名可以有下划线或中划线。

JSR303 数据校验:在字段增加一层过滤器验证,可以保证数据的合法性。

实现方式

  • 在类上加注解 @Validated 声明;
  • 在 pom.xml 中导入 spring-boot-starter-validation 依赖;
  • 根据需要在属性上加对应注解声明,进行数据验证。
<!-- spring-boot-starter-validation -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId><version>3.0.1</version>
</dependency>

验证邮箱格式为例:

4. 配置文件的位置以及多环境配置

配置文件可以放置的位置以及优先级,在官网上有详细说明:点此进入。

可以根据开发、测试等不同场景配置多个环境,并选择激活使用哪一个配置文件。


四、Spring Boot 分析

1. pom.xml

  • 核心依赖在父工程 spring-boot-dependencies 中;
  • 在引入 Spring Boot 依赖时,不需要指定版本,因为在父工程中已经指定了版本

2. 启动器

  • 启动器就是 Spring Boot 的启动场景;
  • Spring Boot 会把所有的功能场景变成一个个的启动器,例如 spring-boot-starter-web 会自动导入 Web 环境所用到的所有依赖;
  • 我们要使用什么功能,只需要导入对应的启动器即可,官网:点此进入。

3. 主程序

接下来,将对主程序中的注解(自动装配原理)和 main 方法(主启动类运行)进行分析。

4. 自动装配原理

  • @SpringBootConfiguration :声明是 Spring Boot 的配置文件,同时也是 Spring 的一个组件;
  • @ComponentScan :扫描当前主启动类同级的包;
  • @EnableAutoConfiguration自动导入包,将自动配置的类导入容器,使自动配置生效;
    • @AutoConfigurationPackage
      • 导入类 Registrar :自动注册包;
    • 导入类 AutoConfigurationImportSelector :自动导入选择器,是自动导入包的核心
      • getCandidateConfigurations 方法 :获取候选的配置 configurations;
        • 调用 SpringFactoriesLoader 类中的 loadFactoryNames 方法 :获取所有(主启动类)的加载配置;
          • loadFactoryNames 方法中调用本类中的 loadSpringFactories 方法 :获取自动配置类,遍历,封装。

过程

  1. Spring Boot 在启动时,从类路径 spring-boot-autoconfigure-2.7.12.jar/META-INF/spring.factories 下获取指定的值;
  2. spring.factories 中,所有的组件以类名的方式返回,将这些自动配置的类导入容器自动配置就会生效
  3. 有些自动配置类会被注解 @ConditionalOnxxx 声明,表示如果条件都满足,该自动配置类才会生效;
  4. 之前我们需要手动配置的东西,现在 Spring Boot 帮我们做了,用自动配置类代替了手动配置

总结:Spring Boot 所有的自动配置类都是在启动的时候扫描并加载到容器中,所有的自动配置类都在 spring.factories 中,但是不一定生效,要判断自动配置类被注解 @ConditionalOnxxx 声明的条件是否满足(是否导入了对应的启动器 starter,有了启动器,自动装配就会生效)。

补充 1

  • 注解 @Conditional 的扩展注解有 @ConditionalOnJava、@ConditionalOnClass、@ConditionalOnProperty 等等;
  • 这些扩展注解的作用为:判断是否满足当前指定条件,如果满足,该自动配置类才会生效

补充 2:配置文件的作用是修改 Spring Boot 自动配置的默认值,那么怎么知道配置文件中有哪些默认值呢?

  • 方式一:官网:点此进入;

  • 方式二推荐】:

    • 第一:在 spring.factories 中可以找到所有的自动配置类,或者在 org 包中可以找到所有的类;
    • 第二:找到自动配置类 xxxAutoConfiguration.java ,找到注解 @xxxProperties 中的配置属性类;
    • 第三:这些配置属性类由注解 @ConfigurationProperties 声明,绑定了配置文件,就可以在 yaml 配置文件中配置修改这些属性值。


  • 补充 3:在 yaml 配置文件中可以通过 debug: true 来看自动配置类哪些生效,哪些没有生效:

    • Positive matches :正匹配,自动配置类生效
    • Negative matches :负匹配,自动配置类没有生效
    • Unconditional classes没有条件的类
  • 补充 4:导入了自动配置类,为什么还要导入启动器?

    • :有些自动配置类会被注解 @ConditionalOnxxx 声明,表示如果条件都满足,该自动配置类才会生效,此时就需要导入启动器,满足所需条件

5. 主启动类运行

main 方法

public static void main(String[] args) {SpringApplication.run(Springboot01Application.class, args);
}

说明:run 方法中第一个参数为应用入口的类,第二个参数为命令行参数。

SpringApplication 类主要做了以下四个事情

  1. 推断应用的类型是普通项目还是 Web 项目;
  2. 查找并加载所有可用初始化器,设置到 initializers 属性中;
  3. 找出所有的应用程序监听器,设置到 listeners 属性中;
  4. 推断并设置 main 方法的定义类,找到运行的主类。

注意:

  1. 有目标,持续学习,不断进步!
  2. Spring Boot 官网:https://spring.io/projects/spring-boot#overview
  3. 微服务的具体阐述,中文翻译链接:https://www.cnblogs.com/liuning8023/p/4493156.html
  4. Spring Boot 自定义启动 Banner 在线生成工具:https://www.bootschool.net/ascii

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Kafka:本地设置

这是设置 Kafka 将数据从 Elasticsearch 发布到 Kafka 主题的三部分系列的第一部分;该主题将被 Neo4j 使用。第一部分帮助您在本地设置 Kafka。第二部分将讨论如何设置Elasticsearch将数据发布到Kafka主题。最后 将详细介绍如何使用连接器订阅主题并使用数据。 Kafka Kafka 是…

【Unity】【FBX】如何将FBX模型导入Unity

【背景】 网上能够找到不少不错的FBX模型资源&#xff0c;大大加速游戏开发时间。如何将这些FBX导入Unity呢&#xff1f; 【步骤】 打开Unity项目文件&#xff0c;进入场景。 点击Projects面板&#xff0c;右键选择Import New Assets 选中FBX文件后导入。Assets文件夹中就会…

【软件测试】为bug而生

为什么定位问题如此重要&#xff1f; 可以明确一个问题是不是真的“bug” 很多时候&#xff0c;我们找到了问题的原因&#xff0c;结果发现这根本不是bug。原因明确&#xff0c;误报就会降低多个系统交互&#xff0c;可以明确指出是哪个系统的缺陷&#xff0c;防止“踢皮球”&…

Apache Flink连载(二十一):Flink On Yarn运行原理-Yarn Application模式

🏡 个人主页:IT贫道_大数据OLAP体系技术栈,Apache Doris,Clickhouse 技术-CSDN博客 🚩 私聊博主:加入大数据技术讨论群聊,获取更多大数据资料。 🔔 博主个人B栈地址:豹哥教你大数据的个人空间-豹哥教你大数据个人主页-哔哩哔哩视频 目录 1. 任务提交命令

Android 理解Context

文章目录 Android 理解ContextContext是什么Activity能直接new吗&#xff1f; Context结构和源码一个程序有几个ContextContext的作用Context作用域获取ContextgetApplication()和getApplicationContext()区别Context引起的内存泄露错误的单例模式View持有Activity应用正确使用…

3d导入模型怎样显示原本材质---模大狮模型网

要在导入3D模型时保留原本的材质&#xff0c;您可以尝试以下方法&#xff1a; 导入前检查文件格式&#xff1a;确保您所使用的3D软件支持导入模型的文件格式。不同的软件对文件格式的支持有所差异&#xff0c;选择正确的文件格式可以更好地保留原始材质。 使用正确的材质库&am…

3D 渲染如何帮助电商促进销售?

在线工具推荐&#xff1a; 3D数字孪生场景编辑器 - GLTF/GLB材质纹理编辑器 - 3D模型在线转换 - Three.js AI自动纹理开发包 - YOLO 虚幻合成数据生成器 - 三维模型预览图生成器 - 3D模型语义搜索引擎 3D 渲染图像因其高转化率而成为亚马逊卖家的最新趋势。它是电子商务平…

GPT-5、开源、更强的ChatGPT!OpenAI公布2024年计划

年终岁尾&#xff0c;正值圣诞节热闹气氛的OpenAI写下了2024年的发展清单。 OpenAI联合创始人兼首席执行官Sam Altman在社交平台公布&#xff0c;AGI&#xff08;稍晚一些&#xff09;、GPT-5、更好的语音模型、更高的费率限制&#xff1b; 更好的GPTs&#xff1b;更好的推理…

python可视化界面自动生成,python如何做可视化界面

大家好&#xff0c;小编来为大家解答以下问题&#xff0c;python gui可视化操作界面制作&#xff0c;python做出的炫酷的可视化&#xff0c;现在让我们一起来看看吧&#xff01; 目录 前言 一.环境配置 插件&#xff1a; 1.python 2.Chinese 3.Open In Default Browser 安装pyt…

【K8S 基本概念】Kurbernetes的架构和核心概念

目录 一、Kurbernetes 1.1 简介 1.2、K8S的特性&#xff1a; 1.3、docker和K8S&#xff1a; 1.4、K8S的作用&#xff1a; 1.5、K8S的特性&#xff1a; 二、K8S集群架构与组件&#xff1a; 三、K8S的核心组件&#xff1a; 一、master组件&#xff1a; 1、kube-apiserve…

Zookeeper之手写一个分布式锁

前言 我之前写了一篇快速上手ZK的文章&#xff1a;https://blog.csdn.net/qq_38974073/article/details/135293106 本篇最要是进一步加深学习ZK&#xff0c;算是一次简单的实践&#xff0c;巩固学习成果。 设计一个分布式锁 对锁的基本要求 可重入&#xff1a;允许同一个应…

【软件工程】漫谈增量过程模型:软件开发的逐步之道

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a; 软件工程 ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 前言&#xff1a; 正文 增量过程模型&#xff08;Incremental Process Model&#xff09; 主要特点和阶段&#xff1a; 优点&#xff1…

【滑动窗口】C++算法:K 个不同整数的子数组

作者推荐 动态规划 多源路径 字典树 LeetCode2977:转换字符串的最小成本 本题涉及知识点 滑动窗口 LeetCoe992 K 个不同整数的子数组 给定一个正整数数组 nums和一个整数 k&#xff0c;返回 nums 中 「好子数组」 的数目。 如果 nums 的某个子数组中不同整数的个数恰好为 …

右键添加 idea 打开功能

1.开始运行regedit 2.找到: HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Directory\shell _3.开始设置 一、右键shell目录新建项Idea二、右键Idea新建command三、选择Idea 右侧空白出新建字符串 名字为Icon 值填入idea的运行程序地址 四、选择command 默认项填入idea的运行程序地址…

Vue3-29-路由-编程式导航的基本使用

补充一个知识点 路由配置中的 name 属性 &#xff1a; 可以给你的 路由 指定 name属性&#xff0c;称之为 命名路由。 这个 name 属性 在 编程式导航 传参时有重要的作用。 命名路由的写法如下 &#xff1a; 像指定 path 一样&#xff0c;直接指定一个 name 属性即可。{path:/d…

python+django网上购物商城系统o9m4k

语言&#xff1a;Python 框架&#xff1a;django/flask可以定制 软件版本&#xff1a;python3.7.7 数据库&#xff1a;mysql 数据库工具&#xff1a;Navicat 开发工具pycharm/vscode都可以 前端框架:vue.js 系统使用过程主要涉及到管理员和用户两种角色&#xff0c;主要包含个…

智能优化算法应用:基于减法平均算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于减法平均算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于减法平均算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.减法平均算法4.实验参数设定5.算法结果6.…

人工智能_机器学习078_聚类算法_概念介绍_聚类升维_降维_各类聚类算法_有监督机器学习_无监督机器学习---人工智能工作笔记0118

首先看一下什么是聚类,我们可以进入sklearn的官网去看看 可以看到这里,首先classification 这个分类我们学完了,然后就是regression回归我们也学完了对吧,其实我们现实生活中的,大部分问题就是 这两种问题就可以解决了. 然后我们再来看一个: clustering,这个就是聚类对吧.聚类算…

提升数据库性能的关键指南-Oracle AWR报告

文章目录 一、了解AWR报告&#xff1a;数据库性能的仪表盘二、生成AWR报告三、解读AWR报告的关键部分1.报告开头的系统基础信息2.ADDM发现3.负载概览(Load Profile)4.参数文件5.顶级前台等待事件6.SQL 统计信息-顶级SQL7.SGA Advisory AND PAG Advisory 一、了解AWR报告&#x…

Linux之磁盘分区,挂载

Linux分区 分区介绍 对linux来说无论有几个分区&#xff0c;分给哪个目录使用&#xff0c;归根结底只有一个根目录&#xff0c;linux中每个分区都是用来组成整个文件系统的一部分。linux采用“载入"的处理方法&#xff0c;他的整个文件系统中包含一整套的文件和目录&…