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容器中。

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

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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • SIGPIPE信号

    SIGPIPE信号当一个进程向某个已收到RST的套接字执行写操作时,内核向该进程发送一个SIGPIPE信号。该信号的默认行为是终止进程,因此进程必须捕获它以免不情愿地被终止。不论该进程是捕获了该信号并从其信号处理函数返回,还是简单地忽略该信号,写操作都将返回EPIPE错误。

    2022年5月7日
    45
  • 2014—多校训练2(ZCC Loves Codefires)

    2014—多校训练2(ZCC Loves Codefires)

    2021年8月31日
    55
  • jetson nano安装pycuda

    jetson nano安装pycudaJetPack4.4版本使用之前配置cuda的环境$sudonano~/.bashrcexportPATH=/usr/local/cuda-10.2/bin:$PATHexportLD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATHexportCUDA_HOME=$CUDA_HOME:/usr/local/cuda-10.2$sudosource~/.bashrc$nvcc-V检测一下是否配置成功之后下载[p

    2022年10月23日
    0
  • RowBounds[通俗易懂]

    RowBounds[通俗易懂]在mybatis中,使用RowBounds进行分页,非常方便,不需要在sql语句中写limit,即可完成分页功能。但是由于它是在sql查询出所有结果的基础上截取数据的,所以在数据量大的sql中并不适用,它更适合在返回数据结果较少的查询中使用最核心的是在mapper接口层,传参时传入RowBounds(intoffset,intlimit)对象,即可完成分页。不需要修改xml配置添加limitmapper接口层代码如下List<Book>selectBoo

    2022年4月19日
    44
  • Python生成器建议收藏

    1.生成器使用yield语句,每次产生一个值,函数就会被冻结2.列表推导式可以用来创建list例:生成[1*1,2*2,3*3,4*4,5*5]的列表,即[1,4,9,16,25]

    2021年12月18日
    38
  • 【032】JavaScript 计算笛卡尔积[通俗易懂]

    【032】JavaScript 计算笛卡尔积[通俗易懂]这是一个用JavaScript实现笛卡尔积的例子。注意:本文中所说的集合是指数学上的集合,不是es6里的Set。整体思路如下:用户传入一个二维的数组,每个子数组都是一个要进行笛卡尔积计算的集合。返回一个二维数组,每个子数组都是一个有序对或者n元有序组。当用户传入一个集合的时候,为了兼容业务,返回形如:[[a],[b]…]的二维数组。当用户只传入两个集合计算的时候,普通的嵌套计算即可。当用

    2022年7月11日
    13

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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