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

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 {};

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

相关文章:

  • 32单片机综合应用案例——基于GPS的车辆追踪器(三)(内附详细代码讲解!!!)
  • 28:CAN总线入门一:CAN的基本介绍
  • Spring Boot经典面试题及答案
  • Oracle报错ORA-01078、LRM-00109
  • 时序数据库TDengine 3.3.5.0 发布:高并发支持与增量备份功能引领新升级
  • 卷积神经05-GAN对抗神经网络
  • 简单的C++程序
  • java源码阅读 - TreeMap
  • 抖音进攻,B站退守
  • 单例模式是什么?如何实现它?
  • 【华为OD机试 2023最新 】 最大利润(C++)
  • 秃头警告 | 年薪50万PM总结的20个成功项目管理经验
  • GPT4中文调教指南。各种场景使用指南。学习怎么让它听你的话。
  • NOIP模拟赛 轰炸(bomb)
  • Callable接口
  • springboot整合redis实现秒杀功能
  • AI开发之——Leonardo—Finetuned Models及利用模型制图(5)
  • vue vben admin 使用, (个人感觉这项目封装的太深了!!!!)
  • 【故障诊断】用于轴承故障诊断的性能增强时变形态滤波方法及用于轴承断层特征提取的增强数学形态算子研究(Matlab代码实现)
  • JavaScript 基础 - 第3天
  • 刷题笔记【1】| 快速刷完67道剑指offer(Java版)
  • 四个常见的Linux面试问题
  • 2023年全国最新保安员精选真题及答案37
  • Qt 5基础 | 创建Hello World程序
  • day 14-文件操作
  • HTTP协议加强