当前位置: 首页 > news >正文

Spring Boot 自动配置一篇概览

一、什么是自动配置 bean

自动配置类通过添加 @AutoConfiguration 注解实现。

因为 @AutoConfiguration 注解本身是以 @Configuration 注解的,所以自动配置类可以算是一个标准的基于 @Configuration 注解的类。

@Conditional 注解可以用于声明自动配置启用条件,通常,我们可以使用 @ConditionalOnClass、@ConditionalOnMissingBean 注解。

二、自动配置发现

Spring Boot 通过检查【META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports】配置文件获取自动配置类。

文件内包含自定义的自动配置类全限定名,每行一个。

示例如下:

1

2

com.mycorp.libx.autoconfigure.LibXAutoConfiguration

com.mycorp.libx.autoconfigure.LibXWebAutoConfiguration  

1、关于约定:

自动配置类必须通过如上配置文件引入。

合理规划其放置包位置,避免被自动包扫描。

内部不要配置自动包扫描,如需要可以使用 @Import 引入。

2、关于顺序

明确的对象先后顺序可以通过配置 @AutoConfiguration 的 before、beforeName、after、afterName 属性,或者使用 @AutoConfigurationBefore、@AutoConfigurationAfter 注解实现。例如 web 服务类配置需要置于 @WebMvcAutoConfiguration 注解之后。

如果没有明确的先后顺序,也可以使用 @AutoConfigureOrder 注解声明顺序。类似 @ Order 注解,不同之处在于其只作用于自动配置类。

三、条件注解

1、类条件

@ConditionalOnClass、@ConditionalOnMissingClass 

1

2

3

4

5

6

7

8

9

@Target({ElementType.TYPE, ElementType.METHOD})

@Retention(RetentionPolicy.RUNTIME)

@Documented

@Conditional({OnClassCondition.class})

public @interface ConditionalOnClass {

    Class<?>[] value() default {};

    String[] name() default {};

}

注解元数据是通过 ASM 处理的,所以可以通过 value 属性传递 Class 类型参数,或者也可以通过 name 传递类全限定名作为参数。

无效情景:

@Bean 注解的方法,其返回值类型为类目标条件类本身。在方法上的条件判正之前,JVM 已经加载了相关的类,并且很可能会执行相关的方法引用,如果类不存在的话,就会导致失败。

为了处理此类情景,需要添加额外的 @Configuration 注解,使用如下:

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

import org.springframework.boot.autoconfigure.AutoConfiguration;

import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;

import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;

import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.Configuration;

@AutoConfiguration

// Some conditions ...

public class MyAutoConfiguration {

    // Auto-configured beans ...

    @Configuration(proxyBeanMethods = false//

    @ConditionalOnClass(SomeService.class)

    public static class SomeServiceConfiguration {

        @Bean

        @ConditionalOnMissingBean

        public SomeService someService() {

            return new SomeService();

        }

    }

}

 2、Bean 条件

@ConditionalOnBean、ConditionalOnMissingBean 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

@Target({ElementType.TYPE, ElementType.METHOD})

@Retention(RetentionPolicy.RUNTIME)

@Documented

@Conditional({OnBeanCondition.class})

public @interface ConditionalOnBean {

    Class<?>[] value() default {};

    String[] type() default {};

    Class<? extends Annotation>[] annotation() default {};

    String[] name() default {};

    SearchStrategy search() default SearchStrategy.ALL;

    Class<?>[] parameterizedContainer() default {};

}

search 属性用于限定搜寻范围。

作用于 @Bean 注解的方法时,默认的目标 Bean 类型为方法的返回值类型。如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

import org.springframework.boot.autoconfigure.AutoConfiguration;

import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;

import org.springframework.context.annotation.Bean;

@AutoConfiguration

public class MyAutoConfiguration {

    @Bean

    @ConditionalOnMissingBean

    public SomeService someService() {

        return new SomeService();

    }

}

条件注解的判正会受 Bean 定义的注册、处理顺序影响,这点需要特别关注。通常建议只在自动配置类上使用条件注解。

@ConditionalOnBean、ConditionalOnMissingBean 条件注解的 @Configuration 类依然会被创建,只不是不会被注册。

当使用 @Bean 注解方法时,返回值最好使用具体的类,而不要使用接口。这一点,对于使用基于 Bean 类型判定的条件注解时尤为重要。

3、属性条件

@ConditionalOnProperty 基于 Spring 的环境变量判正。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

@Retention(RetentionPolicy.RUNTIME)

@Target({ElementType.TYPE, ElementType.METHOD})

@Documented

@Conditional({OnPropertyCondition.class})

public @interface ConditionalOnProperty {

    String[] value() default {};

    String prefix() default "";

    String[] name() default {};

    String havingValue() default "";

    boolean matchIfMissing() default false;

} 

 可以基于前缀或者特定名称来判断。

 4、资源条件

@ConditionalOnResource 基于是否存在特定的资源来判正,如:判定资源“file:/home/user/test.dat”。

5、Web 应用条件

@ConditionalOnWebApplication、@ConditionalOnNotWebApplication

基于当前是否为 Web 应用。

@ConditionalOnWarDeployment、@ConditionalOnNotWarDeployment 判定当前应用是否为传统的部署到 servlet 容器的 WAR 包应用,区别于内嵌的 web 服务器应用。

四、构建 starter

一个典型的 Spring Boot starter 包括如下两点:

  • autoconfigure 模块:包含自动配置相关代码。

  • starter 模块:提供 autoconfigure 模块所需的依赖及其它附属依赖。

1、命名

不要以 spring-boot 做前缀,这是官方保留使用。

以自有工程名做前缀,并附加信息体现其用途。

2、配置键

配置键需要提供专门的命名空间,不要使用 Spring Boot 官方命名空间,

3、autoconfigure 模块

包含使用依赖的所有配置,也可以包括配置键定义及自定义组件初始化的回调接口。

所有引入应该做成可配置的,并且默认为不使用。

Spring Boot 使用注解处理器来收集位于配置文件(META-INF/spring-autoconfigure-metadata.properties)中的自动配置条件,快速过滤掉不需要自动配置的,以加快启动速度。

如果使用 Maven 管理项目,则需要加入如下依赖来处理启用自动配置功能:

1

2

3

4

5

<dependency>

    <groupId>org.springframework.boot</groupId>

    <artifactId>spring-boot-autoconfigure-processor</artifactId>

    <optional>true</optional>

</dependency>  

4、starter 模块

提供依赖。显示声明所有必需的依赖,对于可选的,不要声明。

相关文章:

Spring Boot 自动配置一篇概览

一、什么是自动配置 bean 自动配置类通过添加 AutoConfiguration 注解实现。 因为 AutoConfiguration 注解本身是以 Configuration 注解的&#xff0c;所以自动配置类可以算是一个标准的基于 Configuration 注解的类。 Conditional 注解可以用于声明自动配置启用条件&#x…...

深入理解设计原则之接口隔离原则(ISP)【软件架构设计】

系列文章目录 C高性能优化编程系列 深入理解软件架构设计系列 深入理解设计模式系列 高级C并发线程编程 LSP&#xff1a;接口隔离原则 系列文章目录1、接口隔离原则的定义和解读2、案例解读3、如何判断一个接口是否符合接口隔离原则&#xff1f;小结 1、接口隔离原则的定义和…...

IMX6ULL裸机篇之I2C实验主控代码说明二

一. I2C实验 I2C实验内容&#xff1a; 学习如何使用 I.MX6U 的 I2C 接口来驱动 AP3216C&#xff0c;读取 AP3216C 的传感器数据。 I2C读写数据时序图&#xff1a; I2C写数据时序图如下&#xff1a; I2C读数据时序图如下&#xff1a; 二. I2C主控读写时序 1. 读数据与写数…...

【计算机组成原理与体系结构】数据的表示与运算

目录 一、进位计数制 二、信息编码 三、定点数数据表示 四、校验码 五、定点数补码加减运算 六、标志位的生成 七、定点数的移位运算 八、定点数的乘除运算 九、浮点数的表示 十、浮点数的运算 一、进位计数制 整数部分&#xff1a; 二进制、八进制、十六进制 --…...

如何入门编程

随着信息技术的快速发展&#xff0c;编程已经成为一个越来越重要的技能。那么&#xff0c;我们该如何入门编程呢&#xff1f;欢迎大家积极讨论 一、自学编程需要注意什么&#xff1f; 对于我个人的理解&#xff0c;其实自学编程最重要的就是兴趣。你得培养编程兴趣。 所以在学…...

SQL中CONVERT转化日期函数的使用方法

SQL中CONVERT转化日期函数的使用方法 SQL中CONVERT函数最常用的是使用convert转化长日期为短日期&#xff0c;如果只要取yyyy-mm-dd格式时间, 就可以用convert(nvarchar(10),field,120) 120 是格式代码, nvarchar(10) 是指取出前10位字符. 例如 SELECT CONVERT(nvarchar(10),…...

SpringBoot2-核心技术(一)

SpringBoot2-核心技术&#xff08;一&#xff09; 了解SpringBoot配置文件的使用 文章目录 SpringBoot2-核心技术&#xff08;一&#xff09;了解SpringBoot配置文件的使用一、文件类型1. properties2. yaml 二、yaml的基本使用1. 基本语法2. 数据类型2.1 字面量 2.2 对象2.3 …...

mac host学习

参考&#xff1a; SSH中known_hosts文件作用和常见问题及解决方法 https://blog.csdn.net/luduoyuan/article/details/130070120在 Mac 上更改 DNS 设置 https://support.apple.com/zh-cn/guide/mac-help/mh14127/mac mac中有时候你输入的域名&#xff0c;但会跳转到与期望ip不…...

Java之~指定String日期时间,5分钟一截取时间

// 截取5分钟时间Testpublic void timeCutForDay() throws ParseException {String startTime "2023-03-28 09:16:03";String endTime "2023-03-31 23:59:59";SimpleDateFormat dateFormat new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");D…...

【chatGPT4结对编程】chatGPT4教我做图像分类

开始接触深度学习 大语言模型火了之后&#xff0c;我也想过是否要加入深度学习的行业当中来&#xff0c;一开始的想法就是AI大模型肯定会被各大厂垄断&#xff0c;我们作为普通应用型软件工程师直接调用api就完事&#xff0c;另外对自己的学历也自卑(刚刚够线的二本&#xff0…...

Different romantic

001 他暗恋上我们班上的一个女生。 He has a crush on a girl in our class. crush n. 迷恋 have a crush on (someone) 暗恋&#xff08;某人&#xff09; crush 也可以指“暗恋的对象”。例如&#xff0c;“他在大学曾经暗恋过两个人”&#xff0c;英语就是He had two crushe…...

learn C++ NO.7——C/C++内存管理

引言 现在是5月30日的正午&#xff0c;图书馆里空空的&#xff0c;也许是大家都在午休&#xff0c;也许是现在37摄氏度的气温。穿着球衣的我已经汗流浃背&#xff0c;今天热火战胜了凯尔特人&#xff0c;闯入决赛。以下克上的勇气也激励着我&#xff0c;在省内垫底的大学中&am…...

SDUT数据库原理——第十章作业(参考答案)

1. 简述使用检查点方法进行数据恢复的一般步骤。 答: (1)使用检查点方法进行数据恢复,首先从重新开始文件(见P302页图10.3)中找到最后一个检查点记录在日志文件中的地址,由该地址在日志文件中找到最后一个检查点记录。 (2)由该检查点记录得到检查点建立时刻所有正在…...

My Note of Diffusion Models

Diffusion Models Links: https://theaisummer.com/diffusion-models/ Markovian Hierachical VAE rvs: data: x 0 x_{0} x0​,representation: x T x_{T} xT​ ( p ( x 0 , x 1 , ⋯ , x T ) , q ( x 1 , ⋯ , x T ∣ x 0 ) ) (p(x_0,x_1,\cdots,x_T),q(x_1,\cdots,x_{T…...

【P37】JMeter 仅一次控制器(Once Only Controller)

文章目录 一、仅一次控制器&#xff08;Once Only Controller&#xff09;参数说明二、测试计划设计2.1、测试计划一2.1、测试计划二 一、仅一次控制器&#xff08;Once Only Controller&#xff09;参数说明 可以让控制器内部的逻辑只执行一次&#xff1b;单次的范围是针对某…...

cleanmymac要不要下载装机?好不好用

当我们收到一台崭新的mac电脑&#xff0c;第一步肯定是找到一款帮助我们管理电脑运行的“电脑管家”&#xff0c;监控内存运行、智能清理系统垃圾、清理Mac大文件旧文件、消除恶意软件、快速卸载更新软件、隐私保护、监控系统运行状况等。基本在上mac电脑防护一款CleanMyMac就够…...

DNS风险分析及防护研究(五):常见的DNS威胁与防御(中科三方)

DNS是互联网运行重要的基础设施&#xff0c;在全球互联网运转中扮演重要作用。互联网中的每一次访问都开始于一次DNS查询&#xff0c;从而将人们更好辨识的域名转换为数字化的IP地址。随着互联网的快速发展以及网络技术的快速发展&#xff0c;DNS固有的缺陷逐步暴露出来&#x…...

使用geoserver发布shp和tiff数据

一、安装并启动geoserver服务 1.1 下载geoserver 进入官网下载 由于geoserver是使用Java语言开发的&#xff0c;所以运行需要java的环境&#xff0c;不同geoserver的版本号对java的版本要求不同&#xff0c;所以选择版本时需注意对应java的版本要求&#xff0c;由于我本地安…...

谷歌周彦祺:LLM浪潮中的女性科学家多面手丨智源大会嘉宾风采

导读 大模型研发竞赛如火如荼&#xff0c;谷歌紧随OpenAI其后推出PalM2、Gemini等系列模型。Scaling Law是否仍然适用于当下的大模型发展&#xff1f;科技巨头与初创企业在竞争中各有哪些优势和劣势&#xff1f;模型研究者应秉持哪些社会责任&#xff1f; 2023智源大会「基础模…...

Burp模块

Target模块 记录流量 1.Target按主机或域名分类记录 2.HTTP History 按时间顺序记录且会记录很多次 3.Target模块的作用 &#xff08;1&#xff09;把握网站的整体情况 &#xff08;2&#xff09;对一次工作的域进行分析 &#xff08;3&#xff09;分析网站存在的攻击面 …...

sql笔记:SQL SERVER字符串填充(标量值函数创建、标量值函数调用)

/*字符串填充 ,如果返回 -1 说明输入参数有错误*/ CREATE FUNCTION [dbo].[uf_pad_string] ( @string_unpadded VARCHAR(100), --123填充前字符串 @pad_char VARCHAR(1), --0 填充的字符串 @pad_count tinyint, --10 填充后字符串长度 @pad_p…...

python使用hTTP方法

Python中可以使用requests库来发送HTTP请求&#xff0c;其中包括GET、POST、PUT、DELETE等方法。下面是一个使用requests库发送HTTP请求的示例&#xff1a; python import requests # 发送GET请求 response requests.get(Example Domain) # 发送POST请求 data {key1: valu…...

JavaSE常用API

1. Math.round(11.5)等于多少&#xff1f;Math.round(- 11.5) 又等于多少? Math.round(11.5)的返回值是 12&#xff0c;Math.round(-11.5)的返回值是-11。四舍五入的原理是在参数上加 0.5然后进行取整。 2. switch 是否能作用在 byte 上&#xff0c;是否能作用在 long 上…...

华为OD机试之模拟商场优惠打折(Java源码)

模拟商场优惠打折 题目描述 模拟商场优惠打折&#xff0c;有三种优惠券可以用&#xff0c;满减券、打折券和无门槛券。 满减券&#xff1a;满100减10&#xff0c;满200减20&#xff0c;满300减30&#xff0c;满400减40&#xff0c;以此类推不限制使用&#xff1b; 打折券&…...

5月VR大数据:Quest 2下跌超1%,其它变化不大

Hello大家好&#xff0c;每月一期的VR内容/硬件大数据统计又和大家见面了。 想了解VR软硬件行情么&#xff1f;关注这里就对了。我们会统计Steam平台的用户及内容等数据&#xff0c;每月初准时为你推送&#xff0c;不要错过喔&#xff01; 本数据报告包含&#xff1a;Steam VR硬…...

CW32系列模数转换器(ADC)

模数转换器&#xff08;ADC&#xff09;的主要功能是将模拟量转换为数字量&#xff0c;方便MCU进行处理。下面以CW32L083为例介绍CW系列的模数转换器的特点和功能&#xff0c;并提供演示实例。 一、概述 CW32L083 内部集成一个 12 位精度、最高 1M SPS 转换速度的逐次逼近型模…...

电动力学专题:电磁场规范不变性与规范自由度

对称性&#xff0c;不变性&#xff0c;相对性&#xff0c;协变形 在现代物理学中常常被认为具有相同的含义&#xff08;好拗口&#xff09; 规范与规范的自由度 保证电磁场物理量不改变的情况下&#xff0c;有多组势可供选择&#xff0c;而每组势可以称为一个规范 规范不变性…...

max delay的应用场景与常见问题

max delay与min delay用来约束start points到endpoints点对点的路径长度,set_max_delay约束最大值,set_min_delay约束最小值。 max delay的-from和-to并不局限在get_pins,get_cells和get_clocks同样可以。 set_max_delay 5 -from UFF0/Q -to UFF1/D set_max_delay -from …...

非阻塞队列

非阻塞队列 首先我们要简单的理解下什么是非阻塞队列&#xff1a; 与阻塞队列相反&#xff0c;非阻塞队列的执行并不会被阻塞&#xff0c;无论是消费者的出队&#xff0c;还是生产者的入队。 在底层&#xff0c;非阻塞队列使用的是CAS(compare and swap)来实现线程执行的非阻塞…...

动力电池管理系统(BMS)

BMS技术 目录 BMS技术 一、BMS简介 二、BMS主要功能 1、参数检测 2、剩余电量&#xff08;SOC&#xff09;估计 3、充放电控制 4、热管理 5、均衡控制 6、故障诊断 7、信息监控 8、参数标定 9、CAN总线接口 三、BMS架构组成 1、BMS的拓扑架构 1、1集中式架构的B…...