概 述Spring Boot的约定大于设置装备摆设的功力让我们如沐春风,主动设置装备摆设、开箱即用,冗杂的XML设置装备摆设也省了,几乎不要太爽。并且前一段时间JetBrains公司发布的Java 2020查询拜访也显示Spring Boot的利用占61%。

我们在开发基于 Spring Boot的应用时,用到了一些新的注解和类,此中我们见得最多的注解之一,当属 Spring Boot 应用启动类上所加的 @SpringBootApplication 注解:

本文就来看看它到底是个啥!
@SpringBootApplication 注解背后是什么?@SpringBootApplication注解现实上是Spring Boot供给的一个复合注解,我们来看一看其源码:
@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)@Documented@Inherited@SpringBootConfiguration@EnableAutoConfiguration@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class), @Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })public @interface SpringBootApplication { ...}看得很清晰,其是一个合成体,但此中最重要的三个注解别离是:
@SpringBootConfiguration@EnableAutoConfiguration@ComponentScan我们无妨称其为 “ 三兄弟复合构造 ”,下面别离分析一下那三个注解各自的成效。
@SpringBootConfiguration看代码吧,代码里是如许写的:
@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)@Documented@Configurationpublic @interface SpringBootConfiguration {}那申明 @SpringBootConfiguration 也是来源于 @Configuration,二者功用都是将当前类标注为设置装备摆设类,并将当前类里以 @Bean 注解标识表记标帜的办法的实例注入到Spring容器中,实例名即为办法名。
至于@Configuration,我想在非Spring Boot时代各人应该就不目生,感化是设置装备摆设Spring容器,也即 JavaConfig 形式的 Spring IoC 容器的设置装备摆设类所利用。
到目前来看,仿佛还没有什么新工具。
@EnableAutoConfiguration再继续看代码,代码是如许的:
@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)@Documented@Inherited@AutoConfigurationPackage@Import(AutoConfigurationImportSelector.class)public @interface EnableAutoConfiguration { ...}@EnableAutoConfiguration 注解启用主动设置装备摆设,其能够帮忙 Spring Boot 应用将所有契合前提的 @Configuration 设置装备摆设都加载到当前 IoC 容器之中,能够简要用图形示意如下:

接下来我们对照源码,来解释一下那个流程:
@EnableAutoConfiguration 借助 AutoConfigurationImportSelector 的帮忙,然后者通过实现 selectImports() 办法来导出 Configuration
AutoConfigurationImportSelector类的 selectImports() 办法里面通过挪用Spring Core 包里 SpringFactoriesLoader类的loadFactoryNames()办法
最末通过 SpringFactoriesLoader.loadFactoryNames(),在内部的函数挪用里读取了 ClassPath 下面的 META-INF/spring.factories 文件来获取所有导出类。而spring.factories文件里关于 EnableAutoConfiguration的设置装备摆设其实就是一个 “键值对” 构造,样子大要长下面如许:

说了那么多,若是从略微宏不雅一点的角度 归纳综合总结 上述那一过程那就是:
从 ClassPath下扫描所有的 META-INF/spring.factories 设置装备摆设文件,并将spring.factories文件中的 EnableAutoConfiguration对应的设置装备摆设项通过反射机造实例化为对应标注了 @Configuration 的形式的IoC设置装备摆设类,然后注入IoC容器。
@ComponentScan@ComponentScan 对应于XML设置装备摆设形式中的 ,用于将一些标注了特定注解的bean定义批量收罗注册到Spring的IoC容器之中,那些特定的注解大致包罗:
@Controller@Entity@Component@Service@Repository等等关于该注解,还能够通过 basePackages 属性来更细粒度的控造该注解的主动扫描范畴,好比:
@ComponentScan(basePackages = {"cn.codesheep.controller","cn.codesheep.entity"})可见那个注解也并非什么新工具。






还没有评论,来说两句吧...