SpringBoot的自动配置原理

从零构建:Esp32+Esp-IDF驱动ST7789屏幕并集成LVGL图形库 本文详细介绍了如何从零开始使用Esp32和Esp-IDF驱动ST7789屏幕并集成LVGL图形库。内容涵盖环境准备、SPI驱动配置、屏幕初始化、LVGL图形库集成及常见问题排查,帮助开发者快速实现高效稳定的显示解决方案。 阅读详情

SpringBoot的自动配置原理

 

自动配置原理

 

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

  配置文件能配置的属性参照 :https://docs.spring.io/spring-boot/docs/1.5.9.RELEASE/reference/htmlsingle/#common-application-properties

1、自动配置原理:

   1)、SpringBoot启动的时候加载主配置类,开启了自动配置功能

   2)、@EnableAutoConfiguration 作用:

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import({AutoConfigurationImportSelector.class})  //选择器  给容器导入一些组件
public @interface EnableAutoConfiguration {
    String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration";

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

    String[] excludeName() default {};
}

可以查看:

AutoConfigurationImportSelector类中的方法:
@Override
    public String[] selectImports(AnnotationMetadata annotationMetadata) {
        if (!isEnabled(annotationMetadata)) {
            return NO_IMPORTS;
        }
        AutoConfigurationMetadata autoConfigurationMetadata = AutoConfigurationMetadataLoader
                .loadMetadata(this.beanClassLoader);
        AutoConfigurationEntry autoConfigurationEntry = getAutoConfigurationEntry(
                autoConfigurationMetadata, annotationMetadata);
        return StringUtils.toStringArray(autoConfigurationEntry.getConfigurations());
    }
protected List<String> getCandidateConfigurations(AnnotationMetadata metadata,     //获取到候选的配置
            AnnotationAttributes attributes) {
        List<String> configurations = SpringFactoriesLoader.loadFactoryNames(   //从类路径下得到资源
                getSpringFactoriesLoaderFactoryClass(), getBeanClassLoader());
        Assert.notEmpty(configurations,
                "No auto configuration classes found in META-INF/spring.factories. If you "
                        + "are using a custom packaging, make sure that file is correct.");
        return configurations;
    }

继续点击:

  public static List<String> loadFactoryNames(Class<?> factoryClass, @Nullable ClassLoader classLoader) {
        String factoryClassName = factoryClass.getName();
        return (List)loadSpringFactories(classLoader).getOrDefault(factoryClassName, Collections.emptyList());
    }

查看方法:

loadSpringFactories
private static Map<String, List<String>> loadSpringFactories(@Nullable ClassLoader classLoader) {
        MultiValueMap<String, String> result = (MultiValueMap)cache.get(classLoader);
        if (result != null) {
            return result;
        } else {
            try {   //扫描的文件
                Enumeration<URL> urls = classLoader != null ? classLoader.getResources("META-INF/spring.factories") : ClassLoader.getSystemResources("META-INF/spring.factories");
                LinkedMultiValueMap result = new LinkedMultiValueMap();

                while(urls.hasMoreElements()) {
                    URL url = (URL)urls.nextElement();
                    UrlResource resource = new UrlResource(url);
                    Properties properties = PropertiesLoaderUtils.loadProperties(resource);   //最后做成了properties
                    Iterator var6 = properties.entrySet().iterator();

                    while(var6.hasNext()) {
                        Entry<?, ?> entry = (Entry)var6.next();
                        String factoryClassName = ((String)entry.getKey()).trim();
                        String[] var9 = StringUtils.commaDelimitedListToStringArray((String)entry.getValue());
                        int var10 = var9.length;

                        for(int var11 = 0; var11 < var10; ++var11) {
                            String factoryName = var9[var11];
                            result.add(factoryClassName, factoryName.trim());  //遍历添加到结果集合中
                        }
                    }
                }

                cache.put(classLoader, result);
                return result;
            } catch (IOException var13) {
                throw new IllegalArgumentException("Unable to load factories from location [META-INF/spring.factories]", var13);
            }
        }
    }

 

总结上面的步骤思路:

利用EnableAutoConfigurationImportSelector给容器中导入一些组件?

可以查看selectImports()方法的内容;
List configurations = getCandidateConfigurations(annotationMetadata, attributes);获取候选的配置

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

 

将META-INF/spring.factories EnableAutoConfiguration的值加入到了容器中:

有非常非常多我就不全部截图了,大家有兴趣可以自己看下。每一个这样的xxAutoConfiguration类都是容器总的一个组件,都加入到容器中

用他们做自动配置!

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

 

举一个栗子:

以:org.springframework.boot.autoconfigure.web.servlet.HttpEncodingAutoConfiguration,\  为例子进行解释自动配置原理

根据当前配置类,决定这个配置类是否生效。

生效了这些组件的属性是从对应的properties类中获取的,这些类是跟配置绑定的

最后通过@Bean给容器添加组件

 * {@link EnableAutoConfiguration Auto-configuration} for configuring the encoding to use
 * in web applications.
 *
 * @author Stephane Nicoll
 * @author Brian Clozel
 * @since 1.2.0
 */
@Configuration   //表示一个 配置类,以前编写的配置文件一样,也可以给容器中添加组件
@EnableConfigurationProperties(HttpProperties.class) //启用指定类的ConfigurationProperties功能   将配置文件中的值和HttpProperties类进行绑定了 并注册到容器中
@ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.SERVLET)  //条件 底层spring的@Conditional注解 满足条件就整个配置类生效 当前应用内是否web应用
@ConditionalOnClass(CharacterEncodingFilter.class) //当前jar包(项目)里面有没有这个类   Spring mvc中解决乱码的过滤器  (以前是xml中配置的)
@ConditionalOnProperty(prefix = "spring.http.encoding", value = "enabled",   //判断配置文件中是否存在配置 spring.http.encoding
        matchIfMissing = true)  //即使我们配置文件中 不配置enable属性 也是默认生效的 
public class HttpEncodingAutoConfiguration {

    private final HttpProperties.Encoding properties;
                                                                        //根据这个类去 编写properties类 属性进行赋值修改           
    public HttpEncodingAutoConfiguration(HttpProperties properties) {  //只有一个有参构造器的情况下 参数的值会从容器中获取  我们可以通过自定义properties进行修改配置!根据bean来的
        this.properties = properties.getEncoding();    
    }

    @Bean
    @ConditionalOnMissingBean
    public CharacterEncodingFilter characterEncodingFilter() {
        CharacterEncodingFilter filter = new OrderedCharacterEncodingFilter();
        filter.setEncoding(this.properties.getCharset().name());
        filter.setForceRequestEncoding(this.properties.shouldForce(Type.REQUEST));  //从properties中获取! 这个类 已经和 springboot的配置文件绑定了
        filter.setForceResponseEncoding(this.properties.shouldForce(Type.RESPONSE));
        return filter;
    }

    @Bean
    public LocaleCharsetMappingsCustomizer localeCharsetMappingsCustomizer() {
        return new LocaleCharsetMappingsCustomizer(this.properties);
    }

    private static class LocaleCharsetMappingsCustomizer implements
            WebServerFactoryCustomizer<ConfigurableServletWebServerFactory>, Ordered {

        private final HttpProperties.Encoding properties;

        LocaleCharsetMappingsCustomizer(HttpProperties.Encoding properties) {
            this.properties = properties;
        }

        @Override
        public void customize(ConfigurableServletWebServerFactory factory) {
            if (this.properties.getMapping() != null) {
                factory.setLocaleCharsetMappings(this.properties.getMapping());
            }
        }

        @Override
        public int getOrder() {
            return 0;
        }

    }

}

查看类  HttpProperties.class   (所有配置文件中能配置的属性都是在xxProperties类中封装着),所以配置文件中能配置什么就可以参照某一个功能对应的这个属性类

@ConfigurationProperties(prefix = "spring.http")   //从配置文件中获取值和bean中的属性进行绑定
public class HttpProperties {

    /**
     * Whether logging of (potentially sensitive) request details at DEBUG and TRACE level
     * is allowed.
     */
    private boolean logRequestDetails;

    /**
     * HTTP encoding properties.
     */
    private final Encoding encoding = new Encoding();

 

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

 

精髓:

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搞的

比如进入AOP自动配置类中,

必须有三个类才能生效,如果当前类没有aspect 的jar包就能生效哦

 

 

那么我们怎么看,是否生效啊呢?

 

在properties中配置, 开启springboot的debug模式

debug=true,这样我们就可以很方便的知道哪些自动配置 类生效;

 

 很多我贴出来了

=========================
AUTO‐CONFIGURATIONREPORT
=========================


Positivematches:(自动配置类启用的)
‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐

DispatcherServletAutoConfiguration matched:

‐ @ConditionalOnClass found required class
'org.springframework.web.servlet.DispatcherServlet'; @ConditionalOnMissingClass did not find
unwanted class (OnClassCondition)
‐ @ConditionalOnWebApplication (required) found StandardServletEnvironment
(OnWebApplicationCondition)
Negativematches:(没有启动,没有匹配成功的自动配置类) ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
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)

 

 

 

模式:
1)、SpringBoot在自动配置很多组件的时候,先看容器中有没有用户自己配置的(@Bean、@Component)如
果有就用用户配置的,如果没有,才自动配置;如果有些组件可以有多个(ViewResolver)将用户配置的和自己默
认的组合起来;
2)、在SpringBoot中会有非常多的xxxConfigurer帮助我们进行扩展配置
3)、在SpringBoot中会有很多的xxxCustomizer帮助我们进行定制配置

 

 

 

可以一步参考:https://blog.youkuaiyun.com/zxc123e/article/details/80222967

 

 

 

posted @ 2019-04-18 10:49 toov5 阅读(...) 评论(...) 编辑 收藏

倍福控制第三方伺服走CSV模式--以汇川伺服为例 在使用TwinCAT软件控制标准CiA402协议的EtherCAT伺服时使用TwinCAT软件NC自带的运动控制指令控制伺服,此时伺服驱动器一般工作在CSP/CSV/CST模式。最常见伺服驱动器工作在CSP模式,轨迹规划运行在TwinCAT软件,位置环速度环电流环运行在伺服驱动器中。该模式下速度波动较大,需要极度平稳的速度需要采用CSV模式。本文讲述的是伺服驱动器工作在CSV模式,此时轨迹规划和位置环均运行在TwinCAT软件,速度环电流环运行在伺服驱动器中。为了简化文字描述,本文采用图文结合的方式介绍伺服 阅读详情

相关推荐

机器视觉最全面试题总结

空洞卷积(Atrous Convolution)也叫做膨胀卷积、扩张卷积,最初的提出是为了解决图像分割在用下采样(池化、卷积)增加感受野时带来的特征图缩小,后再上采样回去时造成的精度上的损失。空洞卷积通过引入了一个扩张率的超参数,该参数定义了卷积核处理数据时各值的间距。可以在增加感受野的同时保持特征图的尺寸不变,从而代替下采样和上采样a. 是普通的卷积过程(dilation rate = 1),卷积后的感受野为3b. 是dilation rate = 2的空洞卷积,卷积后的感受野为5。

@bangbang的博客 9210

SpringBoot自动配置原理详解

SpringBoot 的核心:自动配置原理详解

真滴不可理喻的博客 1万+

【新手流程】1小时解决Anaconda+Cuda+Cudnn+Pytorch+Pycharm深度学习环境配置

一小时速通Anaconda+Cuda+Cudnn+Pytorch+Pycharm环境配置

m0_57190453的博客 4087

@EnableConfigurationProperties注解

目录 1.概述 2.测试 2.1 使用@EnableConfigurationProperties进行注册 2.2 使用 @Component 注册 3.项目中的使用场景 1.概述 @EnableConfigurationProperties注解的作用是:使 使用 @ConfigurationProperties 注解的类生效。 如果一个配置类只配置@ConfigurationProperties注解,而没有使用@Component或者实现了@Component的其他注解,那..

weixin_38972910的博客 1万+

MFC实现图书管理系统(附完整源码)

MFC实现图书管理系统(附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 801

ABAP CDS View 从入门到精通教程目录:ABAP CDS View 在 SAP 技术体系中的重要地位

学习 ABAP CDS View 的开发技术,体会其背后的设计理念,也就掌握了 SAP S/4HANA 底层数据模型的设计精髓。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 4777

springboot 自动配置原理

springboot 自动配置原理、EnableAutoConfiguration、Configuration、ComponentScan、DeferredImportSelector、ImportSelector

杨宇昌的博客 1万+

使用Simulink对液流电池在微电网中的动态响应进行建模与仿真

本文介绍了使用Simulink对液流电池在微电网中的动态响应进行建模与仿真的方法。通过搭建包含液流电池、双向DC-DC变换器、分布式能源和负载的微电网模型,并设计基于SOC的控制器,详细说明了从模型创建到仿真运行的完整流程。重点分析了液流电池在不同负载条件下的动态特性,评估了系统响应速度、充放电效率和稳定性等性能指标。该仿真方法为验证液流电池在微电网中的应用提供有效工具,有助于优化参数设计和提升系统可靠性。

amy_mhd的博客 136

SpringBoot自动配置原理

Spring Boot通过@EnableAutoConfiguration注解开启自动配置,对jar包下的spring.factories文件进行扫描,这个文件中包含了可以进行自动配置的类,当满足@Condition注解指定的条件时,便在依赖的支持下进行实例化,注册到Spring容器中。通俗的来讲,我们之前在写ssm项目时候,配置了大量坐标和配置内容,搭环境的过程在项目开发中占据了大量时间,Spring Boot的最大的特点就是简化了各种xml配置内容,所以springboot的自动配置。...

m0_46420244的博客 2万+

thermal系列(5)-DTSI中配置Thermal

By: fulinux E-mail: fulinux@sina.com Blog: https://blog.youkuaiyun.com/fulinus 喜欢的盆友欢迎点赞和订阅! 你的喜欢就是我写作的动力! 目录thermal系列目录DTSI中配置ThermalDTSI节点类型描述CPU0的配置举例CPU核hot-plugging举例修改热缓解阈值DTSI的node中带有tracks-lowDTSI中关闭某个Thermal Zones thermal系列目录 thermal系列(1)-引言部分 thermal.

fulinux的博客 1232

YOLO11-Seg优化:卷积变体系列篇 | 动态蛇形卷积(Dynamic Snake Convolution) | ICCV2023

动态蛇形卷积(Dynamic Snake Convolution),增强微小特征提取能力,引入到YOLO11-Seg,与C3k2结合实现二次创新

会AI的学姐 371

【SpringBoot】理解Spring Boot自动配置的底层原理

在前文中,我们介绍了如何通过实现Condition接口并重写matches()方法来创建自定义条件类。Spring Boot的自动配置也是基于类似的条件机制。例如,Spring Boot的自动配置类会根据环境变量、类路径中的类以及现有的Bean来决定是否进行配置。@Override@Bean创建META-INF目录:在资源目录下(src/main/resources),创建META-INF目录。

Mia惠枫的博客 1953

新能源汽车电池及充电原理详解

本文详细介绍了新能源汽车的电池包结构、铅酸电池充放电原理,以及交流和直流充电的工作原理和优缺点。内容涵盖电池串联并联原因、充电设备如车载充电机、交流充电桩和直流充电桩的介绍,以及不同充电模式的连接方式。通过对充电过程的深入探讨,有助于读者理解新能源汽车的充电技术。

让你爱上电路设计 4525

SpringBoot 自动配置原理

SpringBoot自动配置是指Spring Boot能够根据项目中添加的依赖、配置文件和类路径下的类自动配置Spring应用程序,极大地简化开发者的配置工作,提高开发效率。SpringBoot的自动配置是通过注解实现的,它会自动根据你添加的jar依赖来配置你的Spring应用。需求:自定义,要求当导入redis坐标时,SpringBoot自动创建Jedis的Bean参考:可以参考mybatis启动类的应用实现步骤:(1)创建。

indiansummer_的博客 3747

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

springboot自动配置原理

springboot自动配置原理

SO_zxn的博客 832

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Spring Boot 自动配置实现原理(源码分析)

这里我们只简单贴出两个重点方法,process 方法和 selectImports 方法,我们在 process 方法中看到了 AutoConfigurationImportSelector#getAutoConfigurationEntry 方法,这个方法在项目启动时候是调用了的,因此我们可以进一步猜测,项目启动的时候是调用了 AutoConfigurationImportSelector.AutoConfigurationGroup#process 方法。下面我们从源码层面去剖析。

weixin_42118323的博客 1914

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

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

【深入浅出SpringBoot】了解Spring Boot自动配置原理

前言 为什么我们要用 Spring Boot,Spring Boot 最重要的功能是:自动配置。 为什么说是自动配置?先看@SpringBootApplication注解的源码。 @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Inherited @Spr...

SmallCatBaby的博客 1095

Springboot自动配置原理(简单全面)

SpringBoot的自动配置就是当Spring容器启动后,一些配置类、bean对象就自动存入到了IOC容器中,不需要我们手动去声明,从而简化了开发,省去了繁琐的配置操作。比如:我们要进行事务管理、要进行AOP程序的开发,此时就不需要我们再去手动的声明这些bean对象了,我们直接使用就可以从而大大的简化程序的开发,省去了繁琐的配置操作。

qq_51468665的博客 6068

Springboot自动配置原理

Springboot自动配置原理

qq_45443475的博客 971

这样讲 SpringBoot 自动配置原理,你应该能明白了吧

前言 小伙伴们是否想起曾经被 SSM 整合支配的恐惧?相信很多小伙伴都是有过这样的经历的,一大堆配置问题,各种排除扫描,导入一个新的依赖又得添加新的配置。自从有了 SpringBoot 之后,咋们就起飞了!各种零配置开箱即用,而我们之所以开发起来能够这么爽,自动配置的功劳少不了,今天我们就一起来讨论一下 SpringBoot 自动配置原理。 本文主要分为三大部分: SpringBoot 源...

dearKundy的博客 5582

SpringBoot自动配置的原理

自动配置是指应用程序在启动时,SpringBoot根据classpath类路径下的jar包自动配置应用程序所需的一系列bean组件,从而减少开发者的配置工作,提高开发效率。简单来说就是用注解来对一些常规的配置做默认配置,简化xml配置内容,使项目能够快速运行。

qq_72566172的博客 1370

springboot自动配置_spring boot自动配置原理

“ 还记得我们怎么配置文件的吗,里面可以写啥,怎么写。这么多,估计没几个人能够背下来,那么怎么才能知道这个东西怎么写呢?今天就来谈谈配置的终极奥秘——自动配置原理!!!”自动配置原理 我们首先来看看启动类,从这个入口开始,一步一步的究其源码。在我们的spring boot应用启动的时候,我们是直接运行main方法,而这个main方法有一个注解@SpringBootApplication,...

weixin_39643244的博客 168
上一篇: Spring MVC执行流程
下一篇: Spring Boot
Art&Code
博客等级 码龄7年 77粉丝 554原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值