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

🌕博客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引用单个属性的方式

  • 86
    点赞
  • 82
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 122
    评论
SpringBoot是一个开源的Java开发框架,它使得开发者能够快速、方便地构建独立的、基于Spring的应用程序。Jenkins是一个流行的自动化构建工具,它可以帮助开发团队实现持续集成和持续交付。Jenkins与SpringBoot结合使用可以实现自动化构建和部署SpringBoot应用程序的流程。JUnit是一个Java的单元测试框架,它提供了一种方便的方式来编写和运行单元测试。在SpringBoot中使用Jenkins和JUnit可以实现对应用程序进行自动化的单元测试和集成测试。 在Jenkins中,你可以使用Pipeline语法编写流水线脚本来定义构建过程。使用Jenkins的JUnit插件,你可以在构建过程中运行JUnit测试,并生成测试报告。测试报告可以帮助开发团队及时发现和修复代码中的问题。 关于SpringBoot、Jenkins和JUnit的详细学习资料,你可以参考以下资源: - 《JUnit5学习》系列文章可以提升在SpringBoot环境下的单元测试技能。 - Jenkins官方文档提供了关于流水线、测试和构件的详细说明。 - Jacoco官方文档介绍了Jacoco代码覆盖率工具的使用方法。 - 有关Jenkins单元测试的两篇文章提供了实际操作的指导。 - 《Jenkins 2.X Script Pipeline语法基础》一文介绍了Jenkins流水线脚本的基本语法。 如果你在使用Jenkins进行SpringBoot应用程序的单元测试时遇到了问题,你可以参考以下一些常见问题和解决方法: - "Jenkins mvn not found"错误可能是由于Jenkins环境变量中未添加Maven路径导致的。你可以在Jenkins配置中添加Maven路径以解决该问题。 - "NullPointerException in Jenkins"错误可能是由于流水线脚本中的wrap{}语法不支持所导致的。你可以尝试使用其他语法解决该问题。 - "Error cloning remote repo 'origin'"错误可能是由于流水线脚本书写错误所导致的。你可以检查脚本中的语法错误并进行修正。 - "There is insufficient memory for the Java Runtime Environment to continue"错误可能是由于服务器资源不足导致的。你可以整理服务器资源,关闭不常用的Docker容器来释放内存。 - "Could not initialize class jackson.databind.deser.std.JdkDeserializers"错误可能是由于依赖问题导致的。你可以尝试删除某些依赖或更换JDK版本来解决该问题。 - "java.lang.ArrayIndexOutOfBoundsException"错误可能是由于代码中的错误导致的。你可以尝试排查代码中的问题并进行修复。 - "Step 'Publish JUnit test result report' failed: No test report files were found"错误可能是由于测试报告文件未找到所导致的。你可以检查测试报告文件是否正确生成并配置正确的路径。 - "Failed to read test report file"错误可能是由于测试报告文件读取失败所导致的。你可以尝试重新生成测试报告文件或检查文件读取权限。 希望以上信息对你有帮助。祝你在SpringBoot、Jenkins和JUnit的学习和实践中取得成功!<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [blog_demos:CSDN博客专家程序员欣宸的github,这里有四百多篇原创文章的详细分类和汇总,以及对应的源码,...](https://download.csdn.net/download/weixin_42116847/14986863)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [Jenkins实战先看这:Jenkins 集成Junit单元测试+Jacoco统计覆盖率](https://blog.csdn.net/l_mloveforever/article/details/121603703)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 122
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

己不由心王道长

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值