• 【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
    
    • 1
    • 2
    • 3

    定义一个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;
    }
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    注意看,此时是有@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());
        }
    
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    结果:
    在这里插入图片描述
    此时如果把@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;
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    添加配置:

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

    注意这里并没有用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());
        }
    
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    这里我们直接在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
    
    • 1
    • 2

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

  • 相关阅读:
    zookeeper第三章:项目案例
    基于51单片机病床呼叫系统proteus仿真设计(protues仿真+源码+报告)
    【OpenFeign常用配置】
    计算机网络 0816
    音视频从入门到精通——FFmpeg之sws_getContext处理图像函数分析
    SQL小技巧之替换、统计表字段存储数据字节大小。
    糟糕,接口被刷了,怎么办?
    ElementuiPlus的table组件实现行拖动与列拖动
    【C++设计模式之责任链模式:行为型】分析及示例
    火车卖票---Tset类
  • 原文地址:https://blog.csdn.net/qq_63992577/article/details/127625037