SpringBoot自动装配原理「建议收藏」

SpringBoot自动装配原理「建议收藏」SpringBoot项目无需各种配置文件,一个main方法,就能把项目启动起来。那么我们看看SpringBoot是如何进行自动配置和启动的。SpringBoot通过main方法启动SpringApplication类的静态方法run()来启动项目。根据注释的意思,run方法从一个使用了默认配置的指定资源启动一个SpringApplication并返回ApplicationContext对象,这个默认配置如何指定呢?这个默认配置来源于@SpringBootApplication注解,这个注解是个复

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

SpringBoot项目无需各种配置文件,一个main方法,就能把项目启动起来。那么我们看看SpringBoot是如何进行自动配置和启动的。

  • SpringBoot通过main方法启动SpringApplication类的静态方法run()来启动项目。
    在这里插入图片描述
  • 根据注释的意思,run方法从一个使用了默认配置的指定资源启动一个SpringApplication并返回ApplicationContext对象,这个默认配置如何指定呢?
    在这里插入图片描述
  • 这个默认配置来源于@SpringBootApplication注解,这个注解是个复合注解,里面还包含了其他注解。
    在这里插入图片描述
    其中有三个注解是比较重要的:
    1. @SpringBootConfiguration:这个注解的底层是一个@Configuration注解,意思被@Configuration注解修饰的类是一个IOC容器,支持JavaConfig的方式来进行配置;

    2. @ComponentScan:这个就是扫描注解的意思,默认扫描当前类所在的包及其子包下包含的注解,将@Controller/@Service/@Component/@Repository等注解加载到IOC容器中;

    3. @EnableAutoConfiguration:这个注解表明启动自动装配,里面包含连个比较重要的注解@AutoConfigurationPackage和@Import。
      在这里插入图片描述

      • @AutoConfigurationPackage和@ComponentScan一样,也是将主配置类所在的包及其子包里面的组件扫描到IOC容器中,但是区别是@AutoConfigurationPackage扫描@Enitity、@MapperScan等第三方依赖的注解,@ComponentScan只扫描@Controller/@Service/@Component/@Repository这些常见注解。所以这两个注解扫描的对象是不一样的
      • @Import(AutoConfigurationImportSelector.class)是自动装配的核心注解,AutoConfigurationImportSelector.class中有个selectImports方法
        在这里插入图片描述
        selectImports方法还调用了getCandidateConfigurations方法
        在这里插入图片描述
        getCandidateConfigurations方法中,我们可以看下断言,说找不到META-INF/spring.factories,由此可见,这个方法是用来找META-INF/spring.factories文件的
        在这里插入图片描述
        我们可以定位到这个方法所在的类处于spring-boot-autoconfigure-.jar包中,
        在这里插入图片描述
        其中spring.factories文件是一组组的key=value的形式,包含了key为EnableAutoConfiguration的全类名,value是一个
        AutoConfiguration类名的列表,以逗号分隔。在这里插入图片描述
        最终,@EnableAutoConfiguration注解通过@SpringBootApplication注解被间接的标记在了SpringBoot的启动类上,SpringApplicaton.run方法的内部就会执行selectImports方法,进而找到所有JavaConfig配置类全限定名对应的class,然后将所有自动配置类加载到IOC容器中。
        那么这些类是如何获取默认属性值的呢?以ServletWebServerFactoryAutoConfiguration为例,它是Servlet容器的自动配置类
        在这里插入图片描述
        该类上开启了@EnableConfigurationProperties(ServerProperties.class)注解,最终找到了ServerProperties类。至此,我们大致可以了解。在全局配置的属性如:server.port等,通过@ConfigurationProperties注解,绑定到对应的XxxxProperties配置实体类上封装为一个bean,然后再通过@EnableConfigurationProperties注解导入到Spring容器中。
        在这里插入图片描述

总结:SpringBoot启动的时候通过@EnableAutoConfiguration注解找到META-INF/spring.factories文件中的所有自动配置类,并对其加载,这些自动配置类都是以AutoConfiguration结尾来命名的。它实际上就是一个JavaConfig形式的IOC容器配置类,通过以Properties结尾命名的类中取得在全局配置文件中配置的属性,如server.port。
*Properties类的含义:封装配置文件的相关属性。
*AutoConfiguration类的含义:自动配置类,添加到IOC容器中。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/171229.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • Linux命令之解压缩:tar、zip、rar 命令

    Linux命令之解压缩:tar、zip、rar 命令一、简介解压缩是一个常用的操作,在Linux中通常比较常用的是tar命令,zip和rar命令则是Windows中比较常用。二、快速使用1.tar命令语法:tar[主选项+辅选项]文件或目录示例:#压缩文件file1和目录dir2到test.tar.gztar-zcvftest.tar.gzfile1dir2#…

  • spss 13.0 英文正式版14个模块的授权号码

    spss 13.0 英文正式版14个模块的授权号码

  • uni-app打包成安卓app步骤详解[通俗易懂]

    前置:开发环境AndroidStudio下载地址:AndroidStudio官网ORAndroidStudio中文社区HBuilderXApp离线SDK下载:最新android平台SDK下载3.1.10版本起需要申请Appkey,具体请点击链接正文:通过uni-app实现一套代码在微信小程序和安卓端app同时适配1.创建文件创建Demo文件,采用uni-app模板2.创建应用在https://dev.dcloud.net.cn/app页面创建相同名称的应用,并且获取

  • 微型计算机课设电梯控制8255,东南大学吴健雄学微机课程设计电梯控制器.doc[通俗易懂]

    微型计算机课设电梯控制8255,东南大学吴健雄学微机课程设计电梯控制器.doc[通俗易懂]东南大学吴健雄学微机课程设计电梯控制器东南大学吴健雄学院《微机实验及课程设计》课程设计报告FBIWarning:汇编代码是好几届之前的一个学姐的只是修改了一下后完美运行是我自己写的不需要注明出处,就说是你写的专业:吴健雄学院实验室:计算机硬件实验室组别:同组人员:设计时间:2012年5月17日…

  • 驼峰命名法规则_RS命名法举例

    驼峰命名法规则_RS命名法举例三种流行的命名法则目前,业界共有四种命名法则:驼峰命名法、匈牙利命名法、帕斯卡命名法和下划线命名法,其中前三种是较为流行的命名法。驼峰命令法(Camel): 也称骆驼式命名法正如它的名称所表示的那样,是指混合使用大小写字母来构成变量和函数的名字例如,下面是分别用骆驼式命名法和下划线法命名的同一个函数:程序代码printEmployeePaychecks();print_em…

    2022年10月25日
  • 软件开发的一些概念

    10.关系数据库(RelationalDatabases)关系数据库因为在大规模Web服务上缺乏可扩充性而颇受微词,然而,关系数据库仍然是近20年来计算机技术中最伟大的成就。关系数据库对处

    2021年12月23日

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号