Spring Boot 自动配置原理

Spring Boot面试杀手锏————自动配置原理 引言 不论在工作中,亦或是求职面试,Spring Boot已经成为我们必知必会的技能项。除了某些老旧的政府项目或金融项目持有观望态度外,如今的各行各业都在飞速的拥抱这个已经不是很新的Spring启动框架。 当然,作为Spring Boot的精髓,自动配置原理的工作过程往往只有在“面试”的时候才能用得上,但是如果在工作中你能够深入的理解Spring Boot的自动配置原理,将无往不利。 Spr... 阅读详情

Spring Boot 自动配置原理

自动配置原理
配置文件到底能写什么?怎么写?自动配置原理;

参考:https://docs.spring.io/spring-boot/docs/1.5.9.RELEASE/reference/htmlsingle/#common-application-properties
配置文件能配置的属性参照
1、自动配置原理:
1)、SpringBoot启动的时候加载主配置类,开启了自动配置功能 @EnableAutoConfiguration
2)、@EnableAutoConfiguration 作用:
利用EnableAutoConfigurationImportSelector给容器中导入一些组件?
可以查看selectImports()方法的内容;
List configurations = getCandidateConfigurations(annotationMetadata, attributes);获取候选的配置

 注:      

SpringFactoriesLoader.loadFactoryNames()
扫描所有jar包类路径下  META‐INF/spring.factories
把扫描到的这些文件的内容包装成properties对象
从properties中获取到EnableAutoConfiguration.class类(类名)对应的值,然后把他们添加在容器
中

 

 将 类路径下 META-INF/spring.factories 里面配置的所有EnableAutoConfiguration的值加入到了容器中;

 

每一个这样的 xxxAutoConfiguration类都是容器中的一个组件,都加入到容器中;用他们来做自动配置;

 

每一个自动配置类进行自动配置功能;

 

以HttpEncodingAutoConfiguration(Http编码自动配置)为例解释自动配置原理;


 

  

@Configuration   //表示这是一个配置类,以前编写的配置文件一样,也可以给容器中添加组件
    @EnableConfigurationProperties(HttpEncodingProperties.class)  //启动指定类的ConfigurationProperties功能;将配置文件中对应的值和HttpEncodingProperties绑定起来;并把HttpEncodingProperties加入到ioc容器中
    @ConditionalOnWebApplication //Spring底层@Conditional注解(Spring注解版),根据不同的条件,如果满足指定的条件,整个配置类里面的配置就会生效;    判断当前应用是否是web应用,如果是,当前配置类生效
    @ConditionalOnClass(CharacterEncodingFilter.class)  //判断当前项目有没有这个类CharacterEncodingFilter;SpringMVC中进行乱码解决的过滤器;
    @ConditionalOnProperty(prefix = "spring.http.encoding", value = "enabled", matchIfMissing =true)  //判断配置文件中是否存在某个配置  spring.http.encoding.enabled;如果不存在,判断也是成立的
//即使我们配置文件中不配置pring.http.encoding.enabled=true,也是默认生效的;
    public class HttpEncodingAutoConfiguration {

    //他已经和SpringBoot的配置文件映射了
    private final HttpEncodingProperties properties;

    //只有一个有参构造器的情况下,参数的值就会从容器中拿
    public HttpEncodingAutoConfiguration(HttpEncodingProperties properties) {
        this.properties = properties;
    }

    @Bean   //给容器中添加一个组件,这个组件的某些值需要从properties中获取
    @ConditionalOnMissingBean(CharacterEncodingFilter.class) //判断容器没有这个组件?
    public CharacterEncodingFilter characterEncodingFilter() {
        CharacterEncodingFilter filter = new OrderedCharacterEncodingFilter();
        filter.setEncoding(this.properties.getCharset().name());
        filter.setForceRequestEncoding(this.properties.shouldForce(Type.REQUEST));
        filter.setForceResponseEncoding(this.properties.shouldForce(Type.RESPONSE));
        return filter;
    }
}

 

 

根据当前不同的条件判断,决定这个配置类是否生效?
一但这个配置类生效;这个配置类就会给容器中添加各种组件;这些组件的属性是从对应的properties类中获取
的,这些类里面的每一个属性又是和配置文件绑定的;

 

 所有在配置文件中能配置的属性都是在xxxxProperties类中封装者‘;配置文件能配置什么就可以参照某个功
能对应的这个属性类

 

@ConfigurationProperties(prefix = "spring.http.encoding")  //从配置文件中获取指定的值和bean的属
性进行绑定
public class HttpEncodingProperties {
   public static final Charset DEFAULT_CHARSET = Charset.forName("UTF‐8");

 

 

精髓:
1)、SpringBoot启动会加载大量的自动配置类
2)、我们看我们需要的功能有没有SpringBoot默认写好的自动配置类;
3)、我们再来看这个自动配置类中到底配置了哪些组件;(只要我们要用的组件有,我们就不需要再来配置了)
4)、给容器中自动配置类添加组件的时候,会从properties类中获取某些属性。我们就可以在配置文件中指定这
些属性的值;

 

 

xxxxAutoConfigurartion:自动配置类;
给容器中添加组件

xxxxProperties:封装配置文件中相关属性;

 

 

细节
1、@Conditional派生注解(Spring注解版原生的@Conditional作用)
      作用:必须是@Conditional指定的条件成立,才给容器中添加组件,配置配里面的所有内容才生效;

 

@Conditional扩展注解 作用(判断是否满足当前指定条件)
@ConditionalOnJava 系统的java版本是否符合要求
@ConditionalOnBean 容器中存在指定Bean;
@ConditionalOnMissingBean 容器中不存在指定Bean;
@ConditionalOnExpression 满足SpEL表达式指定
@ConditionalOnClass 系统中有指定的类
@ConditionalOnMissingClass 系统中没有指定的类
@ConditionalOnSingleCandidate 容器中只有一个指定的Bean,或者这个Bean是首选Bean
@ConditionalOnProperty 系统中指定的属性是否有指定的值
@ConditionalOnResource 类路径下是否存在指定资源文件
@ConditionalOnWebApplication 当前是web环境
@ConditionalOnNotWebApplication 当前不是web环境
@ConditionalOnJndi JNDI存在指定项

 底层都是 @Conditional

自动配置类必须在一定的条件下才能生效;
我们怎么知道哪些自动配置类生效?
我们可以通过在 yml中启用 debug=true属性;

这样就可以让控制台打印自动配置报告,这样我们就可以很方便的知道哪些自动配置类生效;
 

 会打印日志:

=========================
AUTO‐CONFIGURATION REPORT
=========================
Positive matches:(自动配置类启用的)
‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
   DispatcherServletAutoConfiguration matched:

 ‐ @ConditionalOnClass found required class
'org.springframework.web.servlet.DispatcherServlet'; @ConditionalOnMissingClass did not find
unwanted class (OnClassCondition)
      ‐ @ConditionalOnWebApplication (required) found StandardServletEnvironment
(OnWebApplicationCondition)
       
   
Negative matches:(没有启动,没有匹配成功的自动配置类)
‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
   ActiveMQAutoConfiguration:
      Did not match:
         ‐ @ConditionalOnClass did not find required classes 'javax.jms.ConnectionFactory',
'org.apache.activemq.ActiveMQConnectionFactory' (OnClassCondition)
   AopAutoConfiguration:
      Did not match:
         ‐ @ConditionalOnClass did not find required classes
'org.aspectj.lang.annotation.Aspect', 'org.aspectj.lang.reflect.Advice' (OnClassCondition)

 

 

近期项目做的案例


 

yml:

 

 

 

yml:
 # 自定义配置参数
default:
  job-thread-pool:
    corePoolSize: 10
    maximumPoolSize: 200
    keepAliveTime: 0
    nameFormat: Job-Thread-%d
    queueCapacity: 1024

 

对应的类去读取成Bean:

@Getter
@Setter
@ConfigurationProperties(prefix = "default.job-thread-pool")
public class JobThreadPoolConfig {
    private int corePoolSize;
    private int maximumPoolSize;
    private long keepAliveTime;
    private String nameFormat;
    private int queueCapacity;
}

config中去获取配置信息:

@Configuration
@Slf4j
@EnableConfigurationProperties({JobThreadPoolConfig.class})
public class CommonConfiguration {
 
    @Autowired
    private JobThreadPoolConfig jobThreadPoolConfig;

 

posted @ 2019-04-01 23:37 toov5 阅读(...) 评论(...) 编辑 收藏

[Spring Boot] 4. Spring Boot实现自动配置的原理 入口注解类@EnableAutoConfiguration@SpringBootApplication注解中包含了自动配置的入口注解:@Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Inherited @SpringBootConfiguration @EnableAutoConfiguration 阅读详情

相关推荐

Spring Boot 自动配置 (AutoConfiguration) 原理与实践

掌握 Spring Boot 自动配置,能够更高效地构建 Spring Boot 应用,并更好地理解 Spring Boot 的设计思想。Spring Boot 自动配置是其核心优势,它极大地简化了 Spring 应用的开发。理解自动配置的原理,掌握条件注解的使用,以及学会自定义自动配置,是深入 Spring Boot 的关键。是其核心特性,它极大地简化了 Spring 应用的配置,提升了开发效率。开发者可以自定义自动配置类,扩展 Spring Boot 的功能。等,分别负责不同功能的自动配置。

weixin_52568491的博客 1986

Spring Boot自动配置原理详解

技术组件核心功能工作原理启用自动配置导入AutoConfigurationImportSelector选择要导入的配置实现ImportSelector接口,返回需要导入的类名数组Spring Factories机制配置发现机制通过META-INF/spring.factories文件定位配置类条件注解配置条件判断@ConditionalOnXXX系列根据条件决定是否应用配置自动配置排序控制配置加载顺序通过@AutoConfigureOrder控制优先级属性绑定外部化配置。

m0_73889530的博客 1243

Spring boot面试题---- Spring Boot 自动配置的原理

Spring boot面试题---- Spring Boot 自动配置的原理。

qq_38737545的博客 3586

Spring Boot 自动配置原理详解

的原则,根据项目依赖和上下文环境自动配置应用程序。:根据类路径、Bean存在性、配置属性等条件决定是否启用配置。:简化依赖管理和自动配置的整合。优先使用自动配置,必要时通过自定义 Bean 覆盖。编写自动配置类并使用条件注解控制生效逻辑。通过条件注解精确控制配置类的生效条件。Spring Boot 自动配置通过。,负责加载所有自动配置类。),筛选出符合条件的配置类。:触发自动配置的加载流程。定义的优先级加载配置类。参数,输出条件评估详情。键下的所有自动配置类。模式分析配置加载过程。

qq_62112907的博客 2633

【Spring】Spring boot 的 AutoConfigurationImportSelector 自动配置原理

SpringBoot启动的时候加载主配置类,开启了自动配置功能 参考:Spring : @EnableAutoConfiguration注解 是 Spring Boot 框架中的一个核心注解,它的作用是自动配置 Spring Boot 应用程序的各种组件、功能和模块。该注解的原理主要涉及以下几个方面:@EnableAutoConfiguration 是一个元注解,它本身上标注了 @AutoConfigurationPackage 和 @Import(AutoConfigurationImportSelect

九师兄 1703

VLP16:使用pointcloud_to_laserscan将三维点云转化为二维LaserScan

velodyne16线激光雷达 VLP16:使用pointcloud_to_laserscan将三维点云转化为二维LaserScan

NEUer_ljx的博客 4619

Spring Boot自动配置原理解析

在常规的SSM项目中,通常需要用户自己去进行Spring、Spring MVC、Mybatis的整合,以及Tomcat的配置。的依赖,在中就已经完成了Spring、Spring MVC、Tomcat的整合,通常被称为自动配置。而完成自动配置的关键,在于启动类上的注解:是一个复合注解,其中包含了和Spring Boot的@SpringBootConfiguration:标记当前类是配置类,并且将当前类加入Spring 容器。

西岭千秋雪的博客 1428

ArcGIS Pro 3.0实战:5分钟搞定GDB批量转SHP的Python脚本(附常见错误修复)

本文详细介绍了在ArcGIS Pro 3.0中使用Python脚本将地理数据库(GDB)中的要素类批量转换为Shapefile(SHP)格式的实战方法。文章提供了从基础到增强的完整脚本,重点解决了中文路径报错、字段名截断和属性表乱码等常见问题,并分享了错误处理与编码修复技巧,帮助用户高效、准确地完成数据格式转换与交换。

happy2的博客 767

Spring Boot 自动配置与启动原理全解析

Spring Boot 的“自动配置”靠的是配合条件注解。启动流程的核心是,它完成了环境准备、Bean 加载、容器创建、Web 容器启动等步骤。灵活可扩展:你可以随时覆盖默认配置,也可以通过监听器、初始化器参与启动流程。

m0_73748193的博客 3061

[数字电路]用与非门实现BCD译码器驱动数码管

Hello,大家好。这里是xdd_core,好久不见。今天来和大家聊聊大一数字电路课程的一个课设。# Key word:BCD Decoder,Proteus8.x,NAND Gate,Digital Circuit# 流程:Proteus8.x仿真电路并绘制PCB导出Gerber文件打样,最终实物验证。# 以下为我对这个课设的report(里面对整个设计做了详细介绍,并设计了完整的验证电路) 感谢观看,仅供参考,未经作者允许,禁止转载/抄袭,本文已上传至数据库,查重必挂QAQ BCD to 7-Segme

xddcore的博客 6012

LlamaIndex 入门实战

LlamaIndex是一个“数据框架”,用于帮助构建LLM应用程序。它提供了各种工具,包括数据连接器,用于摄取现有数据源和数据格式(API,PDF,文档,SQL等),以及用于将数据结构化(索引,图形)以便与LLM轻松使用的方式。此外,LlamaIndex还提供了高级的检索/查询接口,可以输入任何LLM输入提示,并返回检索到的上下文和增强知识的输出。它还允许与外部应用程序框架(如LangChain,Flask,Docker,ChatGPT等)轻松集成。

AIGC搞起 1万+

Spring Boot自动配置原理

Spring Boot自动配置原理 Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。它使用“习惯优于配置”的理念可以让你的项目快速运行部署。使用Spring Boot可以不用或者只需要很少的Spring配置。 Spring Boot核心的功能就是自动配置。它会根据在类路径中的jar、类自动配置Bean,当我...

Usher_Ou的博客 8693

抖音短连接v.douyin.com/xxx 如何生成?

最近公司有个需求,在抖音里如何宣传自己的网站,并且不要有拦截域名的提示,截图如下。 通过ida反编译抖音的app后,将下载后的ipa文件用解压缩软件(如7zip等)解压,从解压后的目录Payload/Aweme.app/找到Aweme可执行文件,拖入ida进行反编译,ida可以检测objective-c语法。 然后进入主题,既然是聊天发消息,就尝试在ida里搜索"message",看看能否找到对...

kakuapi的博客 3万+

深入解析Spring Boot自动配置原理

通过对源码的解析,我们了解到,Spring Boot 的自动配置机制主要依赖于 @EnableAutoConfiguration 注解,以及 META-INF/spring.factories 文件中的自动配置类列表。这些自动配置类通过条件注解,决定是否将特定的 Bean 注册到 Spring 容器中,从而实现按需配置,简化开发过程。为了解决这一问题,Spring Boot 引入了自动配置的概念,根据项目的依赖和运行环境,自动配置所需的 Bean,从而简化开发过程。

小健学Java的博客 1479

【推荐100个unity插件之2】 DoTween动画插件的安装和使用整合(最全)

摘要:DOTween动画插件使用指南 DOTween是Unity中强大的动画插件,比原生动画更便捷。安装后需进行初始化设置,通过工具菜单生成程序集。主要提供通用方法(DOTween.To)和便捷方法(如transform.DOMove)两种动画实现方式。插件支持丰富的动画设置(循环、缓动等)和事件回调(OnComplete、OnKill)。还提供动画管理功能,包括清除(DOTween.Clear)、完成(DOTween.CompleteAll)和终止(DOTween.KillAll)动画。常用功能涵盖移动、

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 1万+

农作物生长模型:数学建模与实战案例

在本篇博客中,我们介绍了农作物生长模型的基本原理,并结合Matlab代码和实战案例,演示了如何应用数学建模技术进行农作物生长模型的研究与应用。农作物生长模型在农业领域具有重要意义,希望本篇博客能帮助读者更好地理解农作物生长模型的原理和应用,并在实际农业生产中取得更好的效果。

YOLO 2734

面试官:说一下Spring Boot的自动配置原理?

那么所有其他的和这个类相关的属性都可以在全局配置文件中定义,也就是说,真正“限制”我们可以在全局配置文件中配置哪些属性的类就是这些XxxxProperties类,它与配置文件中定义的prefix关键字开头的一组属性是唯一对应的。除了官方文档为我们提供了大量的属性解释,我们也可以使用IDE的相关提示功能,比如IDEA的自动提示,和Eclipse的YEdit插件,都可以很好的对你需要配置的属性进行提示,下图是使用Eclipse的YEdit插件的效果,Eclipse的版本是:STS 4。

m0_69632475的博客 1094

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Spring Boot中的自动配置原理是什么

Spring Boot 允许开发者创建自己的自动配置类,满足项目特定需求。假设我们希望在应用启动时自动配置一个自定义的MyService,并通过来配置其属性。步骤:创建自动配置类:自定义自动配置类,负责提供具体的配置逻辑。使用注解:使用条件注解来判断是否自动配置。创建文件:将自动配置类注册到文件中。MyService在中,你可以通过配置my.enabled来控制是否启用自动配置的MyServiceSpring Boot 的自动配置机制依赖于和一系列的条件注解(如。

有时间就写写代码 1218

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

【Spring】Spring Boot 自动配置原理分析

本文深入分析了SpringBoot自动配置机制的核心原理,围绕三个关键问题展开:1)自动配置的条件判断(通过@Conditional系列注解实现);2)需要创建的Bean定义(通过@Bean注解标记);3)Bean属性值的来源(通过@ConfigurationProperties绑定配置文件)。文章详细解析了自动配置类的加载过程(通过spring.factories文件)、条件注解的演进(从@Profile到@Conditional)以及属性绑定的实现机制。

小七的博客 1086

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Spring Boot 中的自动配置原理

而自动配置是当程序在引入spring-boot-starter-web 起步依赖,boot工程在启动后,会自动往ioc容器中注入DispatcherServlet等bean对象,这就是自动配置。在没有引入spring-boot-starter-web依赖之前,我们尝试输出spring-boot-starter-web起步依赖会自动注入的bean对象,没有在pom.xml文件中添加改起步依赖时,输出发现根本没有。在讲解Spring Boot 中bean对象的管理的时候,我们注入bean对象的过程如下,

2401_84080967的博客 1789
上一篇: Servlet
下一篇: tomcat和spring mvc
Art&Code
博客等级 码龄7年 77粉丝 554原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值