SpringBootApplication核心注解
导语
致各位读者:本文继上一篇文章对SpringBoot的启动流程精讲之后,就其中的核心注解@SpringBootApplication进行简单的阐述。使用SpringBoot开发过的读者应该都知道,如何确定SpringBoot项目的启动类,@SpringBootApplication注解是最明显的标识。那这个注解仅仅是一个启动类的标识嘛?它究竟为SpringBoot的启动做了什么贡献?所有的所有,小白都整理好了,希望你能够从中收获些什么。最后,小白还是要不厌其烦的恳请各位,如果您觉得文章对您有帮助,还请关注一下,分享一下,让小白有持续不断的动力,给大家推出更多优质内容,感谢
文章要点提前知
@SpringBootApplication是什么?
它只是一个组合注解
@SprintBootApplication是Spring Boot的核心注解,主要目的是开启自动配置,打开@SpringBootApplication注解的源码,我们不难发现它是一个组合注解,所以不能具体说它是什么?只能说它只是一个组合注解而已,没有我们想象的那么神秘。
@SpringBootApplication做了什么?
从上面的内容得知,@SpringBootApplication是一个组合注解,那么要知道@SpringBootApplication注解具体做了些啥,就是对其内部注解的作用进行详细的解析:
@ComponentScan
作用
1、告诉Spring那个package的用注解标识的类会被Spring自动扫描并切装入IoC容器中。2、自动扫描并加载符合条件的组件(比如@Component和@Repository等)或者bean定义,最终将这些Bean加载到IoC容器中。例如:如果有个类使用了@Controller注解标识;那么如果不加上@ComponentScan,进行自动扫描改controller,那么该Controller就不会被Spring扫描到,更不会装入Sprint容器中,因此@Controller注解也没有任何意义。
原理概述
1、开发者可以通过basePakage等属性来细粒度的定制@ComponentScan自动扫描的范围2、如果不指定,则默认Spring框架实现会从声明@ComponentScan所在类的package进行扫描。⚠️这就是SpringBoot的启动类为什么最好放在root package包下面的原因
参数
@SpringBootConfiguration
@SpringBootConfiguration注解继承自@Configuration,二者功能基本一致,标注当前类是配置类,除此之外,会在当前类内声明一个或多个以@Bean注解标记的方法实例纳入到Spring容器中。并且实例方法就是方法名。
EnableAutoConfiguration
借助@Import的支持,收集和注册特定场景相关的Bean配置。将所有符合自动配置条件的bean定义加载到IoC容器。
总结
1、标记当前类为实现自动配置的配置类2、指定自动配置过程中扫描的包列表3、开启Spring自动配置
@SpringBootApplication是如何做到的?
通过上一段文字的学习,其实@SpringBootApplication的注解的核心作用就是实现了自动配置,而集成的三个注解中的“@EnableAutoConfiguration”就是自动配置的核心,所以我们主要从@EnableAutoConfiguration的学习来了解它是如何实现的自动配置。在@EnableAutoConfiguration注解源码中,使用了@Import(AutoConfigurationImportSelector.class)
,因此我们来详细看一下这个自动配置导入的选择器。首先我们自己来想一想,如果要我们去实现自动配置,我们要做些什么?如果是我可能要想的是: 一、我需要确定去自动配置哪些类? 二、将确定好要自动配置的类装配到Sprint容器中。将自动配置的类装配到Sprint容器中,无非本质就是通过反射进行实例化,将实例对象放到一个map中等等,那么最值得学习研究的就是它是怎么去筛选它是如何确定最终配置的配置类的,也就是selectImports()方法来干的事:
selectImports()源码
selectImports()含义流程图
总结
@SpringBootApplication注解原理中最核心的其实就是@EnableAutoConfiguration,这个注解的扩展性非常好,方便springboot无缝对接不同的插件,例如noSql插件,Web插件,JMX协议插件等等。值得我们去好好阅读。