【菠萝】SpringBoot自动装配

318 阅读2分钟

什么是SpringBoot

image.png 官网对SpringBoot的解释,简而言之就是,使用SpringBoot可以快速创建生产级别的Spring应用。

什么是SpringBoot的自动装配

如果没有SpringBoot的自动装配,如果需要启动一个第三方的服务,我们需要书写繁琐的配置文件,配置类。 而自动装配,只需要一个简单的引入依赖,之后通过启动 启动类的main方法 即可。 并且我们可以通过application的配置文件 自定义属性

SpringBoot如何实现自动装配

image.png
可以看到启动类上,只有一个注解 @SpringBootApplication 点击进入

image.png 发现这个注解是一个复合注解,除去上面4个元注解,重点是下面的两个注解
@SpringBootConfiguration
@EnableAutoConfiguration

先看 @SpringBootConfiguration

image.png 可以看到 这其实是一个 @Configuration 修饰的类

解释下 @Configuration 其实就是注入被修饰的类下的bean。 举个例子:

image.png 可以看到,我在启动类增加了一个@Bean 那么在启动的时候,就可以被注入到IOC容器中
小总结:第一个注解@SpringBootConfiguration 其实就是为了申明启动类也是个配置类,可以引入我们需要的bean

最后看重点@EnableAutoConfiguration

image.png 同样是个组合注解,先看@AutoConfigurationPackage

image.png 引入了 AutoConfigurationPackages.Registrar.class,是将该注解修饰的类所在的package作为自动配置的package来管理 当SpringBoot应用启动时默认会将启动类所在的package作为自动配置的package。 这也是为什么,我们会把SpringBoot的启动类,放在最外层包下。

image.png 点进@Import引入的Registar,注意第二个参数,new PackageImports

image.png 可以看到获取的是启动类所在包的包名

再看另一个注解@Import(AutoConfigurationImportSelector.class)

image.png
引入的AutoConfigurationImportSelector.class 很关键
看他的process方法

image.png 继续看getAutoConfigurationEntry方法

image.png

看getCandidateConfigurations方法 image.png

image.png 通过这句话,我们就可以判断出,其实AutoConfigurationImportSelector.class 就是读取META-INF/spring.factories下面的包路径,加载到容器中

image.png 找到这个spring.factories 会发现一共配置了130个类

image.png 随便抽取一个,去spring.factories中查找

image.png 发现就在这里

总结:

1.SpringBoot的自动装配 主要通过 @SpringBootConfiguration 和 @EnableAutoConfiguration 2. @SpringBootConfiguration 读取当前启动类所在包下的类 加入IOC容器,也可以自定义导入Bean 3.@EnableAutoConfiguration 通过扫描 spring.factories 下的130个类,自动注入IOC容器

4.具体的调用细节,需要考虑到spring的初始化过程。主要是依靠configrationClassPostProces这个类,在spring的启动过程, 这个类用来处理解析注解@component @componentScan @propetySource @Bean @Import这些注解,springboot的@imoprt注解就在这个时机解析,导入需要的bean。