SpringBoot源码学习系列——自动配置原理(一)

核心原理概述

关键点

  • @EnableAutoConfiguration 开启自动配置
  • spring.factories 提供自动配置类的全路径,位于jar包META-INF目录下
  • @Conditional 条件注解,自动配置类实例化的前置条件
  • Starters 配置及依赖支持
  • XXAutoConfiguration 具体的自动配置类

关系图

扫描加载
指定自动配置类全路径
提供前置条件判断
配置及依赖支持
EnableAutoConfiguration注解
spring.factories
XXAutoConfiguration
Conditional条件注解
Starters

自动配置流程

通过@SpringBootApplication引入的@EnableAutoConfiguration开启自动配置,去加载spring.factories文件中的AutoConfiguration类,当XXAutoConfiguration满足条件注解@Conditional的前置条件时,实例化XXAutoConfiguration中定义的Bean,并注入Spring容器,完成依赖的自动配置。

@SpringBootApplication注解

注解结构

自动装配
包扫描
提供注入bean的能力
Import注解
AutoConfigurationPackage注解
EnableAutoConfiguration注解
SpringBootApplication注解
ComponentScan注解
Component注解
Configuration注解
SpringBootConfiguration注解

源码解读

@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
		@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {

	/**
	 * Exclude specific auto-configuration classes such that they will never be applied.
	 * 排除指定的自动配置类(不想走SpringBoot的自动配置来初始化的bean),覆盖了EnableAutoConfiguration注解的exclude属性
	 * @return the classes to exclude
	 */
	@AliasFor(annotation = EnableAutoConfiguration.class)
	Class<?>[] exclude() default {};

	/**
	 * Exclude specific auto-configuration class names such that they will never be
	 * applied.
	 * 根据类名排除指定的自动配置类,覆盖了EnableAutoConfiguration注解的excludeName属性
	 * @return the class names to exclude
	 * @since 1.3.0
	 */
	@AliasFor(annotation = EnableAutoConfiguration.class)
	String[] excludeName() default {};

	/**
	 * Base packages to scan for annotated components. Use scanBasePackageClasses
	 * for a type-safe alternative to String-based package names.
	 * 指定扫描的package,开启此package下直接或间接使用了@Component注解的类的初始化,作为ComponentScan注解basePackages属性的别名
	 * @return base packages to scan
	 * @since 1.3.0
	 */
	@AliasFor(annotation = ComponentScan.class, attribute = "basePackages")
	String[] scanBasePackages() default {};

	/**
	 * Type-safe alternative to scanBasePackages for specifying the packages to
	 * scan for annotated components. The package of each class specified will be scanned.
	 * 根据类名指定扫描的包,指定类的包都会被扫描以初始化,类型安全
	 * @return base packages to scan
	 * @since 1.3.0
	 */
	@AliasFor(annotation = ComponentScan.class, attribute = "basePackageClasses")
	Class<?>[] scanBasePackageClasses() default {};

	/**
	 * Specify whether @Bean methods should get proxied in order to enforce
	 * bean lifecycle behavior, e.g. to return shared singleton bean instances even in
	 * case of direct {@code @Bean} method calls in user code. This feature requires
	 * method interception, implemented through a runtime-generated CGLIB subclass which
	 * comes with limitations such as the configuration class and its methods not being
	 * allowed to declare {@code final}.
	 * 指定是否代理@Bean方法来初始化bean,需要运行时生成CGLIB子类进行拦截(CGLIB方式代理的类及其方法不能是final)
	 * @since 2.2
	 * @return whether to proxy {@code @Bean} methods
	 */
	@AliasFor(annotation = Configuration.class)
	boolean proxyBeanMethods() default true;

}

@EnableAutoConfiguration注解

被@EnableAutoConfiguration注解的类所在package会被作为扫描的根路径,因此被@SpringBootApplication注解的类位于顶级package下,以保证所有类可被扫描到。由此可见,入口函数或main方法不依赖于@SpringBootApplication注解,@SpringBootApplication也可以放在其他类上,但该类必须是在顶级package下。

@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {
	// 提供常量,用于配置自动配置的开启、关闭
	String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration";

	/**
	 * Exclude specific auto-configuration classes such that they will never be applied.
	 * @return the classes to exclude
	 */
	Class<?>[] exclude() default {};

	/**
	 * Exclude specific auto-configuration class names such that they will never be
	 * applied.
	 * @return the class names to exclude
	 * @since 1.3.0
	 */
	String[] excludeName() default {};

}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

简单的C++程序

1.1求圆的周长和面积 数据描述&#xff1a; 半径&#xff0c;周长&#xff0c;面积均用实型数表示 数据处理&#xff1a; 输入半径 r&#xff1b; 计算周长 2*π*r &#xff1b; 计算面积 π* r2 &#xff1b; 输出半径&#xff0c;周长&#xff0c;面积&#xff1b; 方法1&…

java源码阅读 - TreeMap

往期文章 HashMap中putAll()方法批量保存的源码解读&#xff0c;并发现严重缺陷用最简单的话讲最明白的红黑树数据结构 - 堆与堆排序 文章目录往期文章一、介绍二、类的声明三、底层实现四、成员变量五、内部类Entry六、构造方法七、buildFromSorted()方法1. computeRedLevel(…

GPT4中文调教指南。各种场景使用指南。学习怎么让它听你的话。

前段时间我免费体验了chatGPT中文版&#xff0c;感觉很有意思&#xff0c;可以提各种各样问题&#xff0c;跟着机器人学习、讨论 接下来我们说一下中文调教指南。各种场景使用指南。学习怎么让它听你的话。 包括但不限于&#xff1a; 学术论文 它可以写各种类型的学术论文&am…

springboot整合redis实现秒杀功能

1、环境搭建 springboot整合redis这个步骤就不详细介绍了&#xff0c;直接放配置和代码 引入依赖 <!-- redis依赖 --> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId&…

AI开发之——Leonardo—Finetuned Models及利用模型制图(5)

一 概述 Finetuned Models介绍及分类使用Finetuned Models的特征制图 二 Finetuned Models介绍及分类 2.1 Finetuned Models窗口调出 Leonardo主页&#xff0c;点击左侧的Finetuned Models切换到Finetuned Models页面 2.2 Finetuned Models介绍 Finetuned Models包含四个选…

【故障诊断】用于轴承故障诊断的性能增强时变形态滤波方法及用于轴承断层特征提取的增强数学形态算子研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

刷题笔记【1】| 快速刷完67道剑指offer(Java版)

本文已收录于专栏&#x1f33b;《刷题笔记》文章目录前言&#x1f3a8; 1、二维数组中的查找题目描述思路&#x1f3a8; 2、替换空格题目描述思路&#x1f3a8; 3、从尾到头打印链表题目描述思路一&#xff08;反转函数&#xff09;思路二&#xff08;递归&#xff09;思路二&a…

Qt 5基础 | 创建Hello World程序

Qt 5基础 | 创建Hello World程序Qt 5基础 | 创建Hello World程序Qt Creator简介创建项目完成Hello World项目发布程序查看项目目录编译release版本程序设置应用程序图标官方博客&#xff1a;https://www.yafeilinux.com/ Qt开源社区&#xff1a;https://www.qter.org/ Qt 5基…

HTTP协议加强

HTTP协议加强 Date: January 19, 2023 Sum: HTTP请求、响应、请求方法、响应状态代码 HTTP协议简介 什么是通信 通信&#xff0c;就是信息的传递和交换。 通信三要素&#xff1a;通信的主体、通信的内容、通信的方式 现实生活中的通信 案例&#xff1a;张三要把自己考上传…

【C++】异常

文章目录C传统处理错误方式C异常概念异常使用1.异常的抛出和捕获2.异常的重新抛出异常安全异常规范自定义异常体系C标准库的异常体系异常的优缺点C传统处理错误方式 C语言传统的错误处理机制&#xff1a; 1. 终止程序&#xff0c;如assert&#xff0c;缺陷&#xff1a;用户难以…

Java中常见的密码学知识

现代密码学 散列函数 散列函数&#xff0c;也见杂凑函数、摘要函数或哈希函数&#xff0c;可将任意长度的消息经过运算&#xff0c;变成固定长度数值&#xff0c;常见的有MD5、SHA-1、SHA256&#xff0c;多应用在文件校验&#xff0c;数字签名中。 MD5 可以将任意长度的原文生…

对于PM来说:拥有PMP证书,就拥有更多机会

现在很多企业发布的招聘信息中项目经理岗/PMO岗的岗位要求中都会有一条&#xff1a;持有PMP/软考等证书的优先。 其实面试的时候&#xff0c;可能两个候选人的经历、经验、期望薪资都差不多&#xff0c;那么面试官就会更倾向于要那些有PMP/软考/ACP等证书的候选人。 为什么持有…

健身房训练计划—背部

杠铃屈腿硬拉&#xff08;臀&#xff0c;大腿&#xff09; 动作要领&#xff1a; 1&#xff0c;站距和肩等宽&#xff0c;脚尖微微外八&#xff0c;拉的时候把杆贴近小腿&#xff0c;身体成45度&#xff08;头背腰成45度&#xff09;。 2&#xff0c;发力的时候腿用力向上蹬&am…

【面试】如何定位线上问题?

这个面试题我在两年社招的时候遇到过&#xff0c;前几天面试也遇到了。我觉得我每一次都答得中规中矩&#xff0c;今天来梳理复盘下&#xff0c;下次又被问到的时候希望可以答得更好。 下一次我应该会按照这个思路去答&#xff1a; 1、如果线上出现了问题&#xff0c;我们更多…

是德N9030B频谱分析仪主要特性和功能

PXA 信号分析仪非常适合航空航天/国防和商用无线通信领域中的高性能研发(R&D)应用。 PXA 分析仪具有更宽的信号分析带宽&#xff0c;能够降低测量不确定度&#xff0c;还能通过本底噪声扩展(NFE)技术显示之前无法捕捉到的信号。 PXA 提供了广泛的测量应用程序和解调功能&am…

高并发系统设计:缓存、降级、限流、(熔断)

高并发系统设计&#xff1a;缓存、降级、限流、(熔断) 在开发高并发系统时有三把利器用来保护系统&#xff1a;缓存、降级和限流。 非核心服务可以采用降级、熔断&#xff0c;核心服务采用缓存和限流&#xff08;隔离流量可以最大限度的保障业务无损&#xff09;。 缓存 缓…

[DFS]

自写组合算法 dfs时&#xff0c;选或不选第k个数&#xff0c;就实现了各种组合。 打印二进制数 vis[0]*10 def dfs(k,s):if k3:print(s)else:vis[k]0#选第k个数dfs(k1,s0)vis[k]1#不选第k个数dfs(k1,s1) dfs(0,)树上DFS 树的重心 树的重心u: 以树上任意一个结点为根计算它…

AutoML-sklearn and torch

一、auto-sklearn 1.1 环境依赖 额外安装swig 第三方库 linux 支持, mac&#xff0c;windows不支持 1.2 示例代码 time_left_for_this_task 设定任务最大时间 per_run_time_limit 每个子任务最大训练时间 include 可以限制任务训练的模型 import autosklearn.classific…

学习HM微博项目第4天

步骤&#xff1a;OAuth授权01_加载登录界面 -> OAuth授权02_获得accessToken -> OAuth授权03_存储账号信息 -> OAuth授权04_封装账号存储 -> OAuth授权05_封装控制器的切换 OAuth授权01_加载登录界面 为了测试方便&#xff0c;暂时把window的根控制器固定设置为授…

12、MySQL数据类型

一、MySQL中的数据类型 二、整数类型 1、整型包含的几种类型 整数类型一共有 5 种&#xff0c;包括 TINYINT、SMALLINT、MEDIUMINT、INT&#xff08;INTEGER&#xff09;和 BIGINT。 2、整型的三个可选属性 1&#xff09; M M : 表示显示宽度&#xff0c;M的取值范围是(0…
最新文章