springboot之自动配置

news2024/12/28 20:36:00

文章目录

  • 前言
  • 一、配置文件及自动配置原理
    • 1、配置文件
    • 2、yaml
      • 1、注解注入方式给属性赋值
      • 2、yaml给实体类赋值
      • 3、Properties给属性赋值
  • 二、springboot的多环境配置
  • 四、自动配置
  • 总结


前言

1、自动装配原理
2、多种方式给属性赋值
3、多环境配置
4、自动配置


一、配置文件及自动配置原理

1、配置文件

springboot使用一个全局的配置文件,配置文件名称是固定的

  • application.properties 语法结构: key = value
  • application.yml 语法结构: key :空格 value

配置文件的作用:修改springboot自动配置的默认值,因为Spring Boot在底层都给我们自动配置好了

2、yaml

标记语言:
以前的配置文件,大多数使用xml来配置;比如一个简单的端口配置
在这里插入图片描述
properties和yaml配置的区别:
yaml

# 普通的key - value
name: bwy

# 对象
student:
  name: bwy
  age: 24

# 行内写法
student: {name: bwy,age: 24}

# 数组
pets:
  - cat
  - dog
  - pig

# 行内写法
pets: [cat,dog,pig]

properties

# properties只能保存键值对

# 普通的key - value
name=bwy

student.name = bwy
student.age = 24

1、注解注入方式给属性赋值

实体类:

@Component
public class Dog {
    @Value("旺财")
    private String name;
    @Value("3")
    private Integer age;

    public Dog(String name, Integer age) {
        this.name = name;
        this.age = age;
    }

    public Dog() {
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Dog{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

测试类:

@SpringBootTest
class HelloworldApplicationTests {
    @Autowired
    private Dog dog;
    @Test
    void contextLoads() {
        System.out.println(dog);
    }
}

测试结果:
在这里插入图片描述

2、yaml给实体类赋值

实体类:

@Component
@ConfigurationProperties(prefix = "person")
public class Person {
    private String name;
    private Integer age;
    private Boolean happy;
    private Date birth;
    private Map<String,Object> maps;
    private List<Object> lists;
    private Dog dog;

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", happy=" + happy +
                ", birth=" + birth +
                ", maps=" + maps +
                ", lists=" + lists +
                ", dog=" + dog +
                '}';
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public Boolean getHappy() {
        return happy;
    }

    public void setHappy(Boolean happy) {
        this.happy = happy;
    }

    public Date getBirth() {
        return birth;
    }

    public void setBirth(Date birth) {
        this.birth = birth;
    }

    public Map<String, Object> getMaps() {
        return maps;
    }

    public void setMaps(Map<String, Object> maps) {
        this.maps = maps;
    }

    public List<Object> getLists() {
        return lists;
    }

    public void setLists(List<Object> lists) {
        this.lists = lists;
    }

    public Dog getDog() {
        return dog;
    }

    public void setDog(Dog dog) {
        this.dog = dog;
    }

    public Person(String name, Integer age, Boolean happy, Date birth, Map<String, Object> maps, List<Object> lists, Dog dog) {
        this.name = name;
        this.age = age;
        this.happy = happy;
        this.birth = birth;
        this.maps = maps;
        this.lists = lists;
        this.dog = dog;
    }

    public Person() {
    }
}

在这里插入图片描述
可以通过这个配置产生提示,如果不配置使用了@ConfigurationProperties这个注解就会爆红
添加依赖即可,不添加也不会运行出错

@ConfigurationProperties的作用:
将配置文件中配置的每一个属性的值,映射到这个组件中;
告诉springboot将本类中的所有属性和配置文件中相关的配置进行绑定
参数:prefix = “person” :将配置文件中的person下面的所有属性一一对应

只有这个组件是容器中的组件,才能使用容器提供的@ConfigurationProperties功能,因此实体类上还需要添加注解:@Component
在这里插入图片描述

yaml配置文件:
注意 yaml文件中不能有大写

person:
  name: bwy
  age: 24
  happy: true
  birth: 2023/3/6
  maps: {k1: 60, k2: 80}
  lists:
    - code
    - music
    - picture
  dog:
    name: 旺财
    age: 3

测试类:

@SpringBootTest
class HelloworldApplicationTests {
    @Autowired
    private Person person;
    @Test
    void contextLoads() {
        System.out.println(person);
    }
}

测试结果:
在这里插入图片描述

3、Properties给属性赋值

加载指定配置文件:
@PropertySource(value = “classpath:bwy.properties”)

实体类
只测试name属性

@Component
//@ConfigurationProperties(prefix = "person")
//加载指定配置文件
@PropertySource(value = "classpath:bwy.properties")
public class Person {
    @Value("${name")
    private String name;
    ……
   }

properties配置文件

name = bwy

测试类同上
运行结果
在这里插入图片描述

在这里插入图片描述

  • 松散绑定:比如yml中写的last-name,这个和lastName是一样的,-后面跟着的字母默认是大写的,这就是松散绑定
  • JSR303数据校验:判断输入的格式是否合法,这个就是我们可以在字段上增加一层过滤器验证,可以保证数据的合法性,@Validated

二、springboot的多环境配置

spring.profiles.active:可以选择激活哪一个配置文件
在这里插入图片描述

#spring.profiles.active=dev
spring.profiles.active=test

ymal配置:

server:
  port: 8081
spring:
  profiles:
    active: dev
---
server:
  port: 8082
spring:
  profiles: dev
---
server:
  port: 8083
spring:
  profiles: test

四、自动配置

在配置文件中能配置的东西,都存在一个固有的规律 ,xxxAutoConfiguration:默认值 xxxProperties 和配置文件绑定,我们就可以使用自定义的配置了!

  • springboot启动会加载大量的自动配置类
  • 看我们需要的功能有没有在SpringBoot默认写好的自动配置类当中
  • 看自动配置类中到底配置了哪些组件(只要我们要用的组件存在在其中,我们就不需要手动配置了)
  • 给容器中自动配置类添加组件的时候,会从properties类中获取某些属性,我们只需要在配置文件中指定这些属性的值即可
  • XXXAutoConfiguration:自动配置类;给容器中添加组件
  • XXXProperties:封装配置文件中相关属性

总结

  • 配置yml和配置properties都可以获取到值,强烈推荐yml
  • 如果在某个业务中,只需要获取配置文件中的某个值,可以使用@value
  • 如果,我们编写了一个JavaBean来和配置文件进行映射,就直接使用@configurationProperties

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2022年数维杯国际大学生数学建模挑战赛A题自动地震地平线跟踪解题全过程论文及程序

2022年数维杯国际大学生数学建模挑战赛 A题 自动地震地平线跟踪 原题再现&#xff1a; 随着我国经济社会发展&#xff0c;地质工作的重要性也日益提高。地震资料解释是地震勘探工程的一个重要阶段&#xff0c;可以明确油气勘探的地下构造特征&#xff0c;为油气勘探提供良好和…

【NLP相关】attention的代码实现

❤️觉得内容不错的话&#xff0c;欢迎点赞收藏加关注&#x1f60a;&#x1f60a;&#x1f60a;&#xff0c;后续会继续输入更多优质内容❤️&#x1f449;有问题欢迎大家加关注私戳或者评论&#xff08;包括但不限于NLP算法相关&#xff0c;linux学习相关&#xff0c;读研读博…

英飞凌Tricore实战系列导读

本文框架 1.系列概述1.1 外设理论及应用介绍1.2 基于TC3xx的MCAL各外设配置开发1.3 基于TC3xx的Davinci工程开发1.4 项目中问题排查经验分享1.5 其他相关话题分享2. 目前已发布系列文章汇总1.系列概述 英飞凌TC3xx以其强大的性能,扩展性,存储及安全性能在汽车电子中扮演着越…

0.基于知识图谱的知识建模详细方案

0.前言 知识图谱以结构化的形式描述客观世界中概念、实体及其关系。实体是客观世界中的事物,概念是对具有相同属性的事物的概括和抽象。本体是知识图谱的知识表示基础,可以形式化表示为,O={C,H, P,A,I},C 为概念集合,如事物性概念和事件类概念,H是概念的上下位关系集…

基于高灵敏度可编程线性霍尔传感器的液压缸位移检测装置(位移传感器)

目前国内工业自动化水平不断提高&#xff0c;工程机械、机床设备等面向自动化的同时&#xff0c;对控制系统的精度要求也越来越严格。在所有使用到液压的机械和设备中&#xff0c;液压缸是必不可少的部件&#xff0c;并且承载着重要的液压转换功能。而液压缸的位移检测在精确控…

Hexo+live2d | 如何把live2d老婆放进自己的博客

参考&#xff1a;Hexo添加Live2D看板娘最新教程live2d-widgetlive2d-widget-models网页/博客Hexo添加live2d游戏角色看板娘,简易添加&#xff0c;碧蓝航线等live2d新型游戏角色模型&#xff08;moc3&#xff09;live2d-moc3jsdelivr方法1可以直接去看参考文章的第一部分的第一篇…

【LeetCode】剑指 Offer 22. 链表中倒数第k个节点 p136 -- Java Version

题目链接&#xff1a;https://leetcode.cn/problems/lian-biao-zhong-dao-shu-di-kge-jie-dian-lcof/ 1. 题目介绍&#xff08;22. 链表中倒数第k个节点&#xff09; 输入一个链表&#xff0c;输出该链表中倒数第k个节点。为了符合大多数人的习惯&#xff0c;本题从1开始计数&…

C语言-基础了解-21-C输入/输出

C输入/输出 一、标准文件 C 语言把所有的设备都当作文件。所以设备&#xff08;比如显示器&#xff09;被处理的方式与文件相同。以下三个文件会在程序执行时自动打开&#xff0c;以便访问键盘和屏幕 文件指针是访问文件的方式&#xff0c;本节将讲解如何从键盘上读取值以及…

葫芦娃自动化平台-appium实战

一、配置jar包 右键用压缩工具打开jar 修改application.yml文件 name: test666 改为自己名字 libPath、drivenPath:改成自己电脑已有路径 修改appium.properties 文件&#xff0c;方式和上面一样 #APP名称 注意带apk后续 例&#xff1a;test.apk 此文件请放置在项目根目录下 …

Property ‘sqlSessionFactory‘ or ‘sqlSessionTemplate‘ are required 问题处理

错误日志&#xff1a; 解决办法&#xff1a; 1.查看配置文件是否正确 # MyBatis-plus配置 mybatis-plus:# 配置Mapper.xml映射文件mapper-locations: classpath*:/mapper/*Mapper.xml# 配置MyBatis数据返回类型别名&#xff08;默认别名是类名&#xff09;type-aliases-packa…

POSTGRESQL SQL 语句案例,一场由LIMIT 1 引发的“奇怪异像”

开头还是介绍一下群&#xff0c;如果感兴趣polardb ,mongodb ,mysql ,postgresql ,redis 等有问题&#xff0c;有需求都可以加群群内有各大数据库行业大咖&#xff0c;CTO&#xff0c;可以解决你的问题。加群请联系 liuaustin3 &#xff0c;在新加的朋友会分到2群。最近一段工作…

JS 数组拍平(多种方法)

前言数组拍平&#xff08;扁平化数组&#xff09;是面试中常考查的知识点&#xff0c;之前发过一篇基础版的数组拍平 传送门通过之后的学习&#xff0c;又了解了一些其他的数组拍平的操作&#xff0c;详情请看下面的文章flatflat 方法可以直接用于数组拍平&#xff0c;不传入参…

Elasticsearch集群搭建、优化及实践

文章目录一、Elasticsearch集群1、Elasticsearch集群概念2、Elasticsearch集群安装3、安装Kibana4、测试集群状态二、Elasticsearch优化1、磁盘选择2、分片策略3、内存设置三、Elasticsearch实践1、ES自动补全2、创建索引3、安装logstash导入数据4、项目搭建5、自动补全功能6、…

nginx七大核心应用场景详解 解决生产中的实际问题 二次开发扩展

nginx七大核心应用场景详解 & 解决生产中的实际问题1、nginx的安装与简单配置1.1、环境准备1.2、nginx基本操作指令&#xff1a;1.3、安装成系统服务1.4、conf 配置文件说明2、虚拟主机2.1、nginx多主机配置2.2、二级域名与短网址解析3、基于反向代理的负载均衡3.1、跳转到…

【Mysql索引】五种索引类型

目录前期准备实操实战主键索引 primary唯一索引 unique执行效果普通索引 noraml执行效果全文索引 fulltext执行效果组合索引执行效果前期准备 创建一个表&#xff0c;如果有测试的表也可以用&#xff08;把主键id设置为自增&#xff09;如果给字段添加的值有中文&#xff0c;需…

vercel和netlify部署代码并解决接口代理转发的问题(和Nginx功能一样)

前言 部署过程就不说了,部署完成后是这样子的 然后访问链接,无法访问 解决 依次点击 Settings–>Domains&#xff0c;在输入框中输入你的域名并点击 Add 按钮。 以此域名为例子demo.gshopfront.dreamlove.top为例,点击添加 我们前往域名管理系统,记录下绿色的值以腾讯云的…

Android Surface 分析+源码

Surface的创建涉及三个部分&#xff1a; App 进程 App需要将自己的内容显示在屏幕上&#xff0c;所以App负责发起Surface创建请求&#xff0c;创建好Surface后, 就可以直接可以在canvas上画图等&#xff0c;最终都会保存到Surface里的buffer里&#xff0c;最后由SurfaceFlinge…

使用docker搭建WordPress博客

文章目录一、前置条件二、拉取镜像三、安装工具及依赖1.安装2.升级pip3.获取docker-compose方法一另一种方法&#xff08;推荐&#xff09;四、创建容器&#xff0c;启用镜像&#xff0c;映射端口五、访问并设置一、前置条件 主机&#xff1a;20.0.0.142 安装docker docker的安…

SQL-刷题技巧-删除重复记录

一. 原题呈现 牛客 SQL236. 删除emp_no重复的记录&#xff0c;只保留最小的id对应的记录。 描述&#xff1a; 删除emp_no重复的记录&#xff0c;只保留最小的id对应的记录。 drop table if exists titles_test; CREATE TABLE titles_test (id int(11) not null primary key…

Matlab论文插图绘制模板第80期—羽状图(Feather)

在之前的文章中&#xff0c;分享了很多Matlab线图的绘制模板&#xff1a; 进一步&#xff0c;再来分享一种特殊的线图&#xff1a;羽状图。 先来看一下成品效果&#xff1a; 特别提示&#xff1a;Matlab论文插图绘制模板系列&#xff0c;旨在降低大家使用Matlab进行科研绘图的…