Springboot

202 阅读2分钟

命名规则

Spring Boot推荐我们自己创建的starter千万不要以spring-boot开始命名,因为以spring-boot开始命名的一般都是人家官方的

*-spring-boot-starter一般都是第三方为我们提供的简化开发的场景启动器。

Spring Boot的自动装配原理

@ImportResource注解允许我们依旧还能使用Spring以前的XML配置文件这种方式,因为它可以导入该Spring配置文件,让其生效

最重要的还是@SpringBootApplication这个核心注解,我之前也说过了,该注解其实就相当于

@SpringBootConfiguration、

@EnableAutoConfiguration

@ComponentScan("com.meimeixia.boot")这三个注解。所以,在这里呢,我就将@SpringBootApplication拆分

image.png

@SpringBootConfiguration的功能

  • 加载的时候,会想加载我们写的类,再去加载配置类

  • 我们不妨点进@SpringBootConfiguration注解的源码里面去看一看,如下图所示,那这个注解到底是来干嘛的呢?

  • 发现该注解上面又标注了一个@Configuration注解,说明当前注解就是一个配置类。也就是说,咱们当前的主程序类其实就是Spring Boot里面的一个配置类,而且它还是一个核心配置类哟!

image.png

@ComponentScan的功能

@ComponentScan指定需要扫描package的路径,@SpringBootApplication也提供了相应属性,指定需要扫描哪些package或不扫描哪些package

@EnableAutoConfiguration的功能

带着这个疑问不妨点进@EnableAutoConfiguration注解的源码里面去看一看,

image.png

还有其他的两个注解,即@AutoConfigurationPackage@Import({AutoConfigurationImportSelector.class})

@AutoConfigurationPackage==》加载启动类包下的所有BD

image.png

用于扫描启动类下所有的 bean,注册到 BDM中

@Import(AutoConfigurationImportSelector.class)详解

AutoConfigurationImportSelector 类实现了 ImportSelector接口,也就实现了这个接口中的 selectImports方法,该方法主要用于获取所有符合条件的类的全限定类名,这些类需要被加载到 IoC 容器中

  • 底层会去寻找META-INF/spring.factories
  • loadSpringFactories方法是从META-INF/spring.factories资源文件中来加载得到所有组件的。也就是说,该方法会默认扫描我们当前系统下所有位于META-INF目录下的spring.factories资源文件。

虽然Spring Boot应用一启动的时候会一股脑的加载所有场景下的自动配置,但是最终还是得根据条件装配规则来按需开启自动配置项。 这都得益于Spring Boot底层的条件装配注解(即@ConditionalOnXxx),例如@ConditionalOnMissingBean,也就是说好些场景下的自动配置是不能完全开启的。

1158841-20190707203656740-1805253848.png

image-20210515161859698.png