首页 > 其他分享 >Spring-自动配置

Spring-自动配置

时间:2024-03-01 23:22:07浏览次数:21  
标签:Spring 配置 boot autoconfigure 导入 自动 spring class

自动配置流程细节梳理:
1、导入starter-web:导入了web开发场景

  • 1、场景启动器导入了相关场景的所有依赖:starter-jsonstarter-tomcatspringmvc
  • 2、每个场景启动器都引入了一个spring-boot-starter,核心场景启动器。(上面三个也有)
  • 3、核心场景启动器引入了spring-boot-autoconfigure包。
  • 4、spring-boot-autoconfigure里面囊括了所有场景的所有配置。
  • 5、只要这个包下的所有类都能生效,那么相当于SpringBoot官方写好的整合功能就生效了。
  • 6、SpringBoot默认却扫描不到 spring-boot-autoconfigure下写好的所有配置类。(这些配置类给我们做了整合操作),默认只扫描主程序所在的包。

2、主程序:@SpringBootApplication

  • 1、@SpringBootApplication由三个注解组成@SpringBootConfiguration声明配置类、@EnableAutoConfiguratio@ComponentScan扫描指定组件包
  • 2、SpringBoot默认只能扫描自己主程序所在的包及其下面的子包,扫描不到 spring-boot-autoconfigure包中官方写好的配置类
  • 3、@EnableAutoConfiguration:SpringBoot 开启自动配置的核心。
    • 1、是由@Import(AutoConfigurationImportSelector.class)提供功能:批量给容器中导入组件。
    • 2、SpringBoot启动会默认加载 142个配置类。
    • 3、这142个配置类来自于spring-boot-autoconfigureMETA-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports文件指定的
      项目启动的时候利用 @Import 批量导入组件机制把 autoconfigure 包下的142 xxxxAutoConfiguration类导入进来(自动配置类)命名规范都是以xxxxAutoConfiguration结尾的自动配置类
      虽然导入了142个自动配置类
    • 4、按需生效:
      并不是这142个自动配置类都能生效
      每一个自动配置类,都有条件注解@ConditionalOnxxx,只有条件成立,才能生效

3、xxxxAutoConfiguration自动配置类

  • 1、给容器中使用@Bean 放一堆组件
  • 2、每个自动配置类都可能有这个注解@EnableConfigurationProperties(ServerProperties.class),用来把配置文件中配的指定前缀的属性值封装到 xxxProperties属性类
  • 3、以Tomcat为例:把服务器的所有配置都是以server开头的。配置都封装到了属性类中
  • 4、给容器中放的所有组件的一些核心参数,都来自于xxxPropertiesxxxProperties都是和配置文件绑定。
  • 只需要改配置文件的值,核心组件的底层参数都能修改

核心流程总结:
1、导入starter,就会导入autoconfigure包。
2、autoconfigure 包里面 有一个文件 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports,里面指定的所有启动要加载的自动配置类
3、@EnableAutoConfiguration 会自动的把上面文件里面写的所有自动配置类都导入进来。xxxAutoConfiguration 是有条件注解进行按需加载
4、xxxAutoConfiguration给容器中导入一堆组件,组件都是从 xxxProperties中提取属性值
5、xxxProperties又是和配置文件进行了绑定
效果:导入starter、修改配置文件,就能修改底层行为。

点开依赖,找到autoconfigure


autoconfigure包里面写了SpringBoot官方的所有场景的全场景的各种配置
比如Web相关的所有配置

JDBC相关的所有配置


public class AutoConfigurationImportSelector implements DeferredImportSelector, BeanClassLoaderAware
      ResourceLoaderAware, BeanFactoryAware, EnvironmentAware, Ordered{

    //批量导入组件
    @0verride
    public String[] selectImports(AnnotationMetadata annotationMetadata){
        if(!isEnabled(annotationMetadata)){
          return NO_IMPORTS;
        }
        AutoConfigurationEntry autoConfigurationEntry = getAutoConfigurationEntry(annotationMetadata)
        return stringUtils.toStringArray(autoConfiqurationEntry.getConfigurations());
}

SpringBoot加载进来24个配置,这些配置又是从哪来的

可以看到是从getCandidateConfigurations方法里返回的全类名。
getCandidateConfigurations方法看看

可以看到是调用了工具类ImportCandidates,然后loadAutoconfiguration.class这个类,configurations现在默认有140+个配置类,远大于返回的24个配置类。
如果找不到这个配置类,则会报错,沿着提示给的路径去看看文件

可以看到文件里存着140多个全类名,并且都以AutoConfiguration为结尾。

//以Tomcat为例
//属性绑定,追入ServerProperties.class看看
@AutoConfiguration
@ConditionalOnNotWarDeployment
@ConditionalOnWebApplication
@EnableConfigurationProperties(ServerProperties.class)
public class EmbeddedWebServerFactorycustomizerAutoconfiquration {

    @Configuration(proxyBeanMethods =false)
    @ConditionalOnclass({ Tomcat.class, UpgradeProtocol.class })
    public static class TomcatWebServerFactoryCustomizerConfiguration {
        @Bean
        public TomcatWebServerFactoryCustomizer tomcatWebServerFactoryCustomizer(Environment environment, 
                 ServerProperties serverProperties){
            return new TomcatWebServerFactoryCustomizer(environment, serverProperties);
        }
    }
}
//把配置文件中所有以"server"开头的,所以跟ServerProperties 一一对应的属性进行绑定,
//比如server.port;server.address
//属性类把配置文件绑定在类中,而且把这个类放进容器中 
//为啥要把属性类放进容器中?
//因为给容器放入Tomcat自定义工厂组件的时候,它要求传入ServerProperties 
//而@Bean的方法参数中如果容器里面有,就去容器里拿;而正好我们把属性类放入了容器
@ConfiqurationProperties(prefix="server", iqnoreUnknownFields =true)
public class ServerProperties {

    private Integer port;
    private InetAddress address;
    private String serverHeader;
    ...
}

标签:Spring,配置,boot,autoconfigure,导入,自动,spring,class
From: https://www.cnblogs.com/tigerWei/p/18048027

相关文章

  • web自动化——Selenium 之下拉
    一、select下拉列表Select类处理select-option1)导入Select类fromselenium.webdriver.support.selectimportSelect2)确保你要操作的元素是select。实例化Select类Select()3)找到select元素对象select_ele=driver.find_element(By.NAME,'cars')4)将sel......
  • AC 自动机
    AC自动机基于字典树Trie,用于多单词匹配问题P3808【模板】AC自动机(简单版)P3796【模板】AC自动机(加强版)structTrie{ intto[30];//edge intfail,end;//end-cnt(samewordwithdifid)}AC[N];#defineroot0intcnt=0;//pointcntinlinevoidbuild(strings){ ......
  • 问题:模拟qq自动登录时候截不到验证码图片
    -超级鹰-注册:普通用户-登录:普通用户-题分查询:充值-创建一个软件(id)-下载实例代码-下载核心代码利用超级鹰进行图片验证的模拟登录fromseleniumimportwebdriverfromselenium.webdriver.common.keysimportKeysfromsele......
  • 03. 设计地图配置表
    更新Hierarchy从Hierarchy中删除了RoomPrefab,然后增加了MapGenerator,并在MapGenerator上面挂载了MapGenerator脚本MapGenerator脚本这个脚本的作用是配置地图上的房间信息(每一列有min~max个房间,这些房间可以是什么类型),然后在Awake的时候获取当前屏幕的高度......
  • 手动创建spring boot项目
    1.我们首先要创建一个Maven项目(这里就不过多演示)2.然后我们点击创建新模块,选择创建Maven模块,然后修改名称,Archtype选择quicker那个,再点击确定。3,创建好以后,我们进行手动的配置pom文件,输入红框中的东西4,创建相应的包,和Java文件5.在SpringbootCreatManualApplication和contro......
  • 【Spring AOP】SpringAOP配置过程——基于XML&&基于注解 && Spring AOP实现原理
    概念SpringAOP-AspectOrientedProgramming面向切面编程AOP的做法是将通用、与业务无关的功能抽象封装为切面类切面可配置在目标方法的执行前、后运行,真正做到即插即用可以在不修改源码的情况下对程序进行扩展AOP配置过程——基于XML配置0.添加依赖创建配置文件......
  • Spring-Boot学习
    Spring-boot学习笔记从零开始创建项目先创建一个空的Maven项目,然后在pom.xml引入Spring-boot-starter的父依赖<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.2......
  • web自动化——Selenium 之切换
    一、窗口(window)切换在浏览器当中,如果在页面进行了某个操作,结果浏览器打开了另外一个新窗口(tab)。如果要操作新窗口当中的页面元素,就需要窗口切换。前提:有新的窗口打开、或者你要操作其它窗口1、sleep(1)或显示等待--等待浏览器新的窗口出现(无法使用隐性等待,隐性......
  • SpringCloud Alibaba-4-Feign远程调用
    远程调用:在分布式系统中,我们使用springboot创建了各种各样服务,那么这些服务之间如何进行远程调用呢。如:订单微服务怎么去调用商品微服务?Ribbon:是Netflix发布的开源项目,主要功能是提供客户端的软件负载均衡算法和服务调用。Ribbon支持的负载均衡策略:BestAvailableRuleAvai......
  • Python安装与环境配置
    1.浏览器输入官方网站打开2.根据自己的电脑选择合适的版本,进行下载软件安装。3.选择下载好的版本,鼠标右键选择以管理员身份运行4.勾选AddPythontoPATH,点击Customizeinstallation请尽量勾选AddPython3.8toPATH,这样可以将Python命令工具所在目录添加到系统的环境变量中5.......