一篇文章轻松了解SpringBoot配置高级

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

前言

本文介绍的是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引用单个属性的方式

总结

到此这篇关于SpringBoot配置高级的文章就介绍到这了,更多相关SpringBoot配置高级内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • SpringBoot浅析安全管理之高级配置

    目录 角色继承 动态权限配置 1. 数据库设计 2. 自定义FilterInvocationSecurityMetadataSource 3. 自定义 AccessDecisionManager 4. 配置 角色继承 SpringBoot浅析安全管理之基于数据库认证中定义了三种角色,但是这三种角色之间不具备任何关系,一般来说角色之间是有关系的,例如 ROLE_admin 一般既具有 admin 权限,又具有 user 权限.那么如何配置这种角色继承关系呢?只需要开发者在 Spring Secur

  • SpringBoot万字爆肝高级配置

    目录 @ConfigurationProperties注入 创建一个新的模板 ServerConfig.java 编写application.yml 编写ConfigurationApplication.java 给第三方Bean绑定属性 方式一 方式二 @EnableconfigurationProperties 解除使用@ConfigurationProperties注释警告 宽松绑定 常量计量单位绑定 数据校验 进制数据转换规则 @ConfigurationProperties注入 创建一

  • 一篇文章轻松了解SpringBoot配置高级

    目录 前言 @ConfigurationProperties 使用场景 小结 宽松绑定/松散绑定 总结 前言 本文介绍的是SpringBoot配置高级部分,课程是跟着黑马走的,所以会有一些借鉴,当然也是笔记,还会参考一些大佬的分享:这里的SpringBoot配置高级,并不是SpringBoot所有的高级配置:SpringBoot体系(或者说Spring)是十分庞大的,笔者也自知不能穷尽,故而只能把所学的东西拿来记一记,练一练.文章内容如若有误,还请大家批评指正. @ConfigurationPr

  • 一篇文章轻松搞懂Java中的自旋锁

    前言 锁作为并发共享数据,保证一致性的工具,在JAVA平台有多种实现(如 synchronized 和 ReentrantLock等等 ) .这些已经写好提供的锁为我们开发提供了便利. 在之前的文章<一文彻底搞懂面试中常问的各种"锁" >中介绍了Java中的各种"锁",可能对于不是很了解这些概念的同学来说会觉得有点绕,所以我决定拆分出来,逐步详细的介绍一下这些锁的来龙去脉,那么这篇文章就先来会一会"自旋锁". 正文 出现原因 在我们的

  • 一篇文章带你搞定SpringBoot中的热部署devtools方法

    一.前期配置 创建项目时,需要加入 DevTools 依赖 二.测试使用 (1)建立 HelloController @RestController public class HelloController { @GetMapping("/hello") public String hello(){ return "hello devtools"; } } 对其进行修改:然后不用重新运行,重新构建即可:只加载变化的类 三.热部署的原理 Spring Boot 中热部

  • 一篇文章带你搞定SpringBoot不重启项目实现修改静态资源

    一.通过配置文件控制静态资源的热部署 在配置文件 application.properties 中添加: #表示从这个默认不触发重启的目录中除去static目录 spring.devtools.restart.exclude=classpath:/static/** 或者使用: #表示将static目录加入到修改资源会重启的目录中来 spring.devtools.restart.additional-paths=src/main/resource/static 此时对static 目录下的静态

  • 一篇文章带你使用SpringBoot基于WebSocket的在线群聊实现

    一.添加依赖 加入前端需要用到的依赖: <dependency> <groupId>org.webjars</groupId> <artifactId>sockjs-client</artifactId> <version>1.1.2</version> </dependency> <dependency> <groupId>org.webjars</groupId> <

  • 一篇文章教你使用SpringBoot如何实现定时任务

    前言 在 Spring + SpringMVC 环境中,一般来说,要实现定时任务,我们有两中方案,一种是使用 Spring 自带的定时任务处理器 @Scheduled 注解,另一种就是使用第三方框架 Quartz ,Spring Boot 源自 Spring+SpringMVC ,因此天然具备这两个 Spring 中的定时任务实现策略,当然也支持 Quartz,本文我们就来看下 Spring Boot 中两种定时任务的实现方式. 一.第一种方式:@Scheduled 使用 @Scheduled

  • 一篇文章带你入门Springboot沙箱环境支付宝支付(附源码)

    目录 0.前言 1.效果展示 2.技术栈介绍 3.前期准备 第一步:申请一个沙箱测试账号 第二步:电脑下载一个支付宝提供的客户端用于生成RSA2 第三步:手机下载 [沙箱版支付宝] 4.后端搭建 项目目录结构 pom.xml application.yml application-alipay.proerties Order订单实体类 Service层 Controller层 配置类 跨域拦截器配置以及注册 启动spirngboot项目 支付操作的页面: 支付完成后支付宝回调的页面: 启动前端项

  • 一篇文章让你轻松记住js的隐式转化

    目录 前言 一.包装类 Boolean() 扩展 Number() 引用类型转换Number 原始类型转Number 还有这些混淆点是需要注意的: 扩展 String() Object.prototype.toString Array.prototype.toString 二.隐式转化触发规则 布尔的隐式转化 number的隐式转化 隐式转化最难的情况 三.特殊情况 四.工作不要使用 总结 前言 之前写过一篇文章[[js让人诟病的这些feature]]中提出过一个疑问. 这个问题一开始我想简单了

  • 一篇文章带你了解spring事务失效的多种场景

    目录 前言 一 事务不生效 1.访问权限问题 2. 方法用final修饰 3.方法内部调用 4.未被spring管理 5.多线程调用 6.表不支持事务 7.未开启事务 二 事务不回滚 1.错误的传播特性 2.自己吞了异常 3.手动抛了别的异常 4.自定义了回滚异常 5.嵌套事务回滚多了 三 其他 1 大事务问题 2.编程式事务 总结 前言 对于从事java开发工作的同学来说,spring的事务肯定再熟悉不过了. 在某些业务场景下,如果一个请求中,需要同时写入多张表的数据.为了保证操作的原子性(要

  • 一篇文章入门Python生态系统(Python新手入门指导)

    译者按:原文写于2011年末,虽然文中关于Python 3的一些说法可以说已经不成立了,但是作为一篇面向从其他语言转型到Python的程序员来说,本文对Python的生态系统还是做了较为全面的介绍.文中提到了一些第三方库,但是Python社区中强大的第三方库并不止这些,欢迎各位Pytonistas补充. •原文链接:http://mirnazim.org/writings/python-ecosystem-introduction/ •译文链接:http://codingpy.com/artic

随机推荐