【SpringBoot】一文了解SpringBoot配置高级

news2024/11/27 8:47:59

文章目录

    • 前言
    • @ConfigurationProperties
        • 使用场景
        • 小结
    • 宽松绑定/松散绑定

🌕博客x主页:己不由心王道长🌕!
🌎文章说明:SpringBoot配置高级🌎
✅系列专栏:SpringBoot
🌴本篇内容:关于bean属性绑定、松散绑定、bean校验和常用计量单位的应用🌴
☕️每日一语:后悔没有用、向前走,找不到方向也走☕️
🕤作者详情:作者是一名双非大三在校生,喜欢Java,欢迎大家探讨学习,喜欢的话请给博主一个三连鼓励。🕤
🚩 交流社区:己不由心王道长(优质编程社区)

前言

本文介绍的是SpringBoot配置高级部分,课程是跟着黑马走的,所以会有一些借鉴,当然也是笔记,还会参考一些大佬的分享;这里的SpringBoot配置高级,并不是SpringBoot所有的高级配置;SpringBoot体系(或者说Spring)是十分庞大的,笔者也自知不能穷尽,故而只能把所学的东西拿来记一记,练一练。文章内容如若有误,还请大家批评指正。

@ConfigurationProperties

@ConfigurationProperties告诉SpringBoot将本类中的所有属性和配置文件中相关的配置进行绑定;要进行绑定,首先这个类要受Spring管理,spring才能操作里面的数据。

使用场景

场景一:使用@ConfigurationProperties和@Component注解到bean定义类上.
注意,这里是到bean定义类上,这里的bean指的是受Spring管理的bean,而@Component注解就是把一个类当成一个bean注册到Spring容器中。
自定义一个配置文件:

book:
  bookName: Spring技术内幕
  price: 36.57

定义一个bean:

package com.example.entity;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

package com.example.entity;

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

/**
 * @author 不止于梦想
 * @date 2022/11/7 18:50
 */
@Component//交给Spring容器管理
@ConfigurationProperties(prefix = "book")//加载配置文件,配置前缀表达式
@Data
public class Book {
    //书名
    private String bookName;
    //价格
    private double price;
}


注意看,此时是有@Component注解的,说明这个bean受Spring容器管理。
测试:

package com.example.springbootconfigureadvanced;

import com.example.entity.Book;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
class SpringBootConfigureAdvancedApplicationTests {
    @Autowired
    Book book;
    @Test
    void contextLoads() {
    }
    @Test
    public void toTest(){
        System.out.println(book.getPrice());
    }

}

结果:
在这里插入图片描述
此时如果把@component去掉:
在这里插入图片描述
直接爆红了,语法都不给你通过,这说明了要@ConfigurationProperties生效,被注入的bean应该要受Spring管理或者说在Spring容器中。

场景二:使用@ConfigurationProperties和@Bean注解在配置类的Bean定义方法上
解释一下:如果我们使用注解开发,一般会把第三方技术写成一个配置类,然后使用@ConfigurationProperties和@Bean注解对其进行注入,从而实现对第三方属性的绑定。
注意这里的两个注解使用在方法上,但是要绑定,这个类必须得让Spring管理,所以需要一个注解来显示这个类,让Spring能够扫描到,以便与可以把其添加到容器中。

新建一个配置类:

package com.example.config;

import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @author 不止于梦想
 * @date 2022/11/7 19:51
 */
@Configuration//声明一个类为配置类,用于取代bean.xml配置文件注册bean对象。
public class MyConfig {

    @ConfigurationProperties(prefix = "datasource")
    @Bean
    public DruidDataSource dataSource(){
        DruidDataSource dataSource = new DruidDataSource();
        return dataSource;
    }
}

添加配置:

dataSource:
  url: jdbc:mysql://127.0.0.1:3306/springBoot?serverTimezone=UTC

注意这里并没有用spring.dataSource格式,如果是那样,倒不如直接在配置文件配好,瞎整配置类干啥。

测试:

package com.example;

import com.alibaba.druid.pool.DruidDataSource;
import com.example.entity.Book;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;

@SpringBootApplication
public class SpringBootConfigureAdvancedApplication {

    public static void main(String[] args) {
        //获取应用上下文配置
        ConfigurableApplicationContext context = SpringApplication.run(
                SpringBootConfigureAdvancedApplication.class, args);
        DruidDataSource dataSource = context.getBean(DruidDataSource.class);
        System.out.println(dataSource.getUrl());
    }

}

这里我们直接在SpringBoot应用类获取应用上下文配置即可获取容器中的bean,不用再费劲去测试类整一堆东西;
验证:
在这里插入图片描述

解释一下,不然不清楚:在上面配置类MyConfig中设置了一个方法,返回值就是数据源对象,就是说使用方法创建了数据源对象,然后使用@Bean把这个方法定义为一个受Spring管理的bean,再使用@ConfigurationProperties(prefix = “datasource”)加载配置文件进入数据源对象,但是这样还不够,这个类Spring并不能扫描到,所以使用@Configuration把这个类定义为配置类,这样就可以加载这个类。

在这里没有的配置文件中的dataSource只是一个普通的配置。

场景三:使用@ConfigurationProperties注解到普通类,然后再通过@EnableConfigurationProperties定义为Bean。

先说一下@EnableConfigurationProperties的用法:这个注解相当于一个开关,用来开启配置的绑定,使用这个注解,不用把类手动交给Spring加载成bean,直接在这个注解后面加上你要开启配置的类的类名.class即可,这个注解会告诉Spring把类加载成bean,并放入容器中。

说白了就是让@ConfigurationProperties生效。

还是上面的例子:
没加@EnableConfigurationProperties、也没有加其他制成bean的注解:
在这里插入图片描述
加上@EnableConfigurationProperties
测试:
在这里插入图片描述

小结

1、注意三种使用情况,特别是第三种,在后面的原理篇会大量出现
2、@EnableConfigurationProperties是一个开关,用来开启被@ConfigurationProperties注解注释而没有其他生成bean注解的类与配置文件注入的开关。

宽松绑定/松散绑定

@ConfigurationProperties绑定属性支持属性名宽松绑定

总的概况就是,只要配置文件的配置的字母数量和字母与被绑定的bean的prefix(前缀)相同都可以绑定,但是注意,prefix的内容全部为小写。配置文件可以出现大小写不一致,甚至可以出现各种符号(非abcd这些)。

绑定前缀名命名规范:仅能使用纯小写字母、数字、下划线作为合法的字符

举例:配置文件

dataSource:
  url: jdbc:mysql://127.0.0.1:3306/springBoot?serverTimezone=UTC

类中:
在这里插入图片描述
可以看到,虽然这里的前缀和配置文件完全相同,但是还是不正确的,prefix必须全为小写。
说完了吗?说完了,其他的试一下就可以,一通百通。
啊,还有就是:
宽松绑定不支持注解@Value引用单个属性的方式

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

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

相关文章

javaweb JavaScript快速入门 对象 BOM DOM 事件监听

JavaScript 引入方式 1.内部脚本:将 JS代码定义在HTML页面中 2.外部脚本:将 JS代码定义在外部 JS文件中,然后引入到 HTML页面中 JavaScript 基础语法 windows.alert可以省略windows var: 1.作用域为全局变量 2.变量可以重复定义 &#xf…

半桥LLC谐振变换器及同步整流MATLAB仿真(一)

在开关电源中,LLC谐振变换器是最常见的DC-DC变换器之一。 LLC谐振电路早在上世纪80年代就已经提出,到如今仍有广泛的应用,可见其优越性。其优点表现在: 1.LLC的开关器件能实现软开关,开关损耗小 2.效率高、功率密度大 …

[附源码]计算机毕业设计JAVA 宠物医院管理系统

[附源码]计算机毕业设计JAVA 宠物医院管理系统 项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybati…

计算结构体大小(内存对齐原则)struct、union、class

这篇博客详细的介绍结构体的大小sizeof:union、struct、class。 一、不同数据类型所占的内存大小: 二、union联合体的结构体大小 1、关注点: (1)联合体的大小为所有成员变量中所占字节数最大的; &#xf…

【Redis 常用五大数据类型】

常用五大数据类型 官方获取redis常见数据类型操作命令: http://www.redis.cn/commands.html 1.Redis键(key) keys * 查看当前库所有key (匹配:keys *1) exists key 判断某个key是否存在 type key 查看你的key是什么类型 del key 删除指定的key数据 unli…

springmvc1:初探springmvc

一.springmvc简介 1.springmvc是什么? ①mvc解释 m:模型层(javabean处理数据)例如pojo类 Service或Daov:视图层(页面展示数据)c:控制层(接受请求和响应浏览器&#xf…

python基于PHP+MySQL 校园二手闲置商品交易系统

每年我国都有几百万的学生参加高考,当学生接到高校的录入通知书的那一刻就要学会独立生活了,大多数学生一般都要奔袭到离家几百设置几千公里之外的地方进行求学,这对初次离开父母远离家乡求学的学子来说是人生的一次挑战。为了能够更好的适应高校的环境,他们的入校之初或者在日…

【Qt】QMainWindow |QDialog对话框

文章目录1、QMainWindow1.1 菜单栏1.2 工具栏1.3 状态栏1.4 停靠部件1.5 核心部件(中心部件)1.6 使用UI文件创建窗口1.6.1 UI设计窗口介绍1.6.2 菜单1.1.6.1 添加/删除菜单栏1.1.6.2 添加菜单1.1.6.3 添加菜单项1.1.6.4 添加多级菜单1.6.3 工具1.1.6.1 添…

机器学习入门(六)神经网络初识

目录 一、模型解释 1.1 用人脑解释 1.2 用模型解释 二、通过异或门的神经网络理解偏置量、神经网络的传播 2.1 与门的神经网络表示 2.2 或门的神经网络表示 2.3 异或门的神经网络表示 三、多物体分类 一、模型解释 1.1 用人脑解释 神经网络是模拟人的神经元&#…

Windows上的实用CMD命令

Windows上的实用CMD命令查看系统信息是x64位查看电脑基本诊断信息检查电脑支持的最大运行内存查看内存信息查看Windows电脑上次的启动时间查看显卡信息查看电脑当前的用户名查看当前的用户是不是电脑的管理员用户查看路由信息 route print查看Windows 的version申明&#xff1a…

从心灰意冷到自学Java3个月顺利拿到offer,多亏这份文档

跳槽时时刻刻都在发生,但是我建议大家跳槽之前,先想清楚为什么要跳槽。切不可跟风,看到同事一个个都走了,自己也盲目的开始面试起来(期间也没有准备充分),到底是因为技术原因(影响自…

Allegro172版本Shape避让方形盘不出现弧形操作指导

Allegro172版本Shape避让方形盘不出现弧形操作指导 Allegro172版本避让方形焊盘的时候,不会像166版本一样避让成方形,如下图 只需要按照下面的操作就可以实现和166版本方形避让一样的效果 打开shape Global dynamic parameter 选择Void Controls Rectangle pad viod cor…

java常见题

1.数组和链表结构简单对比?(ArrayList和linkedList) 数组是一段连续的空间。 大小固定 可能大小不够用或者有浪费 数组查询比较方便,根据下标就可以直接找到元素,时间复杂度O(1);增加和删除比较复杂&…

“双11”来了!企企通B2B商城助力打造供销一体数字化解决方案

今年的“双11”,比往年来得更早。10月20日晚上8点,双11第一波预售开启。电商平台的竞争愈发激烈,直播卖货的崛起更是加重了行业的竞争压力。但淘宝、天猫、京东这类传统的电商平台因其完善且成熟的供应链,使得双11淘宝系主场格局不…

Redis进行RCE利用总结

https://www.cnblogs.com/loongten/p/15838580.html 0x00 简要说明 百度百科:Redis(Remote Dictionary Server ),即远程字典服务,是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库&am…

什么才是好代码?

定义代码质量高低,本来就是主观的,更多的是出于判断。为了做出更客观的评判,我个人 认为有益的做法是后退一步,考虑一下编写代码时真正试图实现的目标。在我看来,帮助我实现这些目标的代码就是高质量的,而产…

ECMAScript 6 语法 1 —— 块作用域构造let 和 const

Javascript 的作用域存在的两种情况 情况一:函数内部 function enterYourChoice(flag){// var有变量提升的作用,相当于在此处写了一个 let choice;if(flag){var choice "yes";}else {console.log(choice); // undefined 并没有报错哦&#…

基于arx模型的MPC预测控制器simulink建模与仿真实现

目录 一、理论基础 二、核心程序 三、测试结果 一、理论基础 MPC的优点 模型预测控制善于处理多输入多输出系统 对于MIMO系统,PID需要为每个子系统单独设计PID控制器,由于存在耦合对于较大的系统难以实现 1.MPC控制器可以较好控制MIMO系统 2…

查题校园公众号题库系统

查题校园公众号题库系统 本平台优点: 多题库查题、独立后台、响应速度快、全网平台可查、功能最全! 1.想要给自己的公众号获得查题接口,只需要两步! 2.题库: 查题校园题库:查题校园题库后台(…

深度学习入门(二十五)卷积神经网络——多输入多输出通道

深度学习入门(二十五)卷积神经网络——多输入多输出通道前言卷积神经网络——填充和步幅课件多个输入通道多个输出通道多个输入和输出通道11卷积层二维卷积层总结教材1 多输入通道2 多输出通道3 11卷积层4 小结前言 核心内容来自博客链接1博客连接2希望…