SpringBoot自动装配原理以及分析

 更新时间:2022年11月19日 16:32:44   作者:Dongguabai  
这篇文章主要介绍了SpringBoot自动装配原理以及分析,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

先看看SpringBoot的主配置类

里面有一个main方法运行了一个run()方法,在run方法中必须要传入一个被@SpringBootApplication注解的类。

@SpringBootApplication

SpringBoot应用标注在某个类上说明这个类是SpringBoot的主配置类,SpringBoot就会运行这个类的main方法来启动SpringBoot项目。

那@SpringBootApplication注解到底是什么呢,点进去看看:

发现@SpringBootApplication是一个组合注解。

@SpringBootConfiguration

先看看@SpringBootConfiguration注解

这个注解很简单,表明该类是一个Spring的配置类。

再进去看看@Configuration

说明Spring的配置类也是Spring的一个组件。

@EnableAutoConfiguration

这个注解是开启自动配置的功能。

先看看@AutoConfigurationPackage注解

这个注解是自动配置包,主要是使用的@Import来给Spring容器中导入一个组件 ,这里导入的是Registrar.class。

来看下这个Registrar

就是通过这个方法获取扫描的包路径,可以debug看看:

在这行代码上打了一个断点

启动项目

进入断点处

看看能否获取扫描的包路径

已经获取到了包路径

那那个metadata是什么呢?

可以看到是标注在@SpringBootApplication注解上的DemosbApplication,也就是我们的主配置类:

说白了就是将主配置类(即@SpringBootApplication标注的类)的所在包及子包里面所有组件扫描加载到Spring容器。

所以包名一定要注意。

现在包扫描路径获取到了,那具体加载哪些组件呢,看看下面这个注解。

@Import({AutoConfigurationImportSelector.class})

@Import注解就是给Spring容器中导入一些组件,这里传入了一个组件的选择器:AutoConfigurationImportSelector。

里面有一个selectImports方法,将所有需要导入的组件以全类名的方式返回;这些组件就会被添加到容器中。

debug运行看看

会给容器中导入非常多的自动配置类(xxxAutoConfiguration);就是给容器中导入这个场景需要的所有组件,并配置好这些组件:

有了自动配置类,免去了我们手动编写配置注入功能组件等的工作。

那他是如何获取到这些配置类的呢,看看上面这个方法:

会从META-INF/spring.factories中获取资源,然后通过Properties加载资源:

Spring Boot在启动的时候从类路径下的META-INF/spring.factories中获取EnableAutoConfiguration指定的值,将这些值作为自动配置类导入到容器中,自动配置类就生效,帮我们进行自动配置工作。

以前我们需要自己配置的东西,自动配置类都帮我们完成了。

J2EE的整体整合解决方案和自动配置都在spring-boot-autoconfigure-2.0.3.RELEASE.jar:

比如看看WebMvcAutoConfiguration

都已经帮我们配置好了,我们不用再单独配置了:

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Java中printStackTrace()用法示例

    Java中printStackTrace()用法示例

    这篇文章主要给大家介绍了关于Java中printStackTrace()用法的相关资料,printStackTrace()方法一般与抛出异常搭配使用,效果是打印出异常位置,需要的朋友可以参考下
    2024-05-05
  • Java支持方法重载的原因

    Java支持方法重载的原因

    今天给大家带来的是关于Java的相关知识,文章围绕着Java方法重载展开,文中有非常详细的介绍及代码示例,需要的朋友可以参考下
    2021-06-06
  • Java遍历Map四种方式讲解

    Java遍历Map四种方式讲解

    这篇文章主要介绍了Java遍历Map四种方式讲解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • 详解spring+springmvc+mybatis整合注解

    详解spring+springmvc+mybatis整合注解

    本篇文章主要介绍了详解spring+springmvc+mybatis整合注解,详细的介绍了ssm框架的使用,具有一定的参考价值,有兴趣的可以了解一下
    2017-04-04
  • Java 如何优雅的抛出业务异常

    Java 如何优雅的抛出业务异常

    这篇文章主要介绍了Java 如何优雅的抛出业务异常,帮助大家更好的理解和使用Java,感兴趣的朋友可以了解下
    2020-12-12
  • springboot如何查找配置文件路径的顺序和其优先级别

    springboot如何查找配置文件路径的顺序和其优先级别

    此文是在工作中遇到的关于springboot配置文件的问题,在网上查阅资料和自己测试之后记录的,以便日后查阅。希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-08-08
  • 详解Spring-Boot中如何使用多线程处理任务

    详解Spring-Boot中如何使用多线程处理任务

    本篇文章主要介绍了详解Spring-Boot中如何使用多线程处理任务,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。
    2017-03-03
  • Spring Cloud gateway 网关如何拦截Post请求日志

    Spring Cloud gateway 网关如何拦截Post请求日志

    这篇文章主要介绍了Spring Cloud gateway 网关如何拦截Post请求日志的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07
  • 一篇文章带你玩转JAVA单链表

    一篇文章带你玩转JAVA单链表

    这篇文章主要为大家详细介绍了Java实现带头结点的单链表,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-09-09
  • MyBatis中${} 和 #{} 有什么区别小结

    MyBatis中${} 和 #{} 有什么区别小结

    ${} 和 #{} 都是 MyBatis 中用来替换参数的,它们都可以将用户传递过来的参数,替换到 MyBatis 最终生成的 SQL 中,但它们区别却是很大的,今天通过本文介绍下MyBatis中${} 和 #{} 有什么区别,感兴趣的朋友跟随小编一起看看吧
    2022-11-11

最新评论