SpringBoot自动配置原理

SpringBoot的主程序中有一个main方法用来启动整个SpringBoot应用

最核心的注解还是 @SpringBootApplication

而这个注解相当于同时使用了
//@SpringBootConfiguration
//@EnableAutoConfiguration
//@ComponentScan
这三个注解

 

 

首先是 @SpringBootConfiguration 

 

 查看源码,发现它实际上就是一个  @Configuration

而 @Configuration 表示当前是一个配置类,即,当前的main方法也是SpringBoot的一个配置类(核心)

 

@ComponentScan 用来指定包扫描

@EnableAutoConfiguration
 1 @Target({ElementType.TYPE})
 2 @Retention(RetentionPolicy.RUNTIME)
 3 @Documented
 4 @Inherited
 5 @AutoConfigurationPackage
 6 @Import({AutoConfigurationImportSelector.class})
 7 public @interface EnableAutoConfiguration {
 8     String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration";
 9 
10     Class<?>[] exclude() default {};
11 
12     String[] excludeName() default {};
13 }

点进源码,发现它也是一个合成注解

分别是:

@AutoConfigurationPackage 自动配置包,给容器导入组件

 

@Import({Registrar.class})
导入的Registrar的作用:把一个包下的所有组件批量注册

所以,
@AutoConfigurationPackage 的作用是将main所在包下的所有组件导入进来,默认的包路径是main所在包的原因
也是这个。


 

 下面讨论 @EnableAutoConfiguration 的第二个注解 

@Import({AutoConfigurationImportSelector.class})

它是利用select批量为容器继续导入东西。


查看 AutoConfigurationImportSelector.class 的源码,
public String[] selectImports

上述方法中数组String[ ] 来导入

此方法中的
getAutoConfigurationEntry(annotationMetadata) 给容器中批量导入一些组件
此方法最终又调用下面的方法来获取所有要导入容器中的配置类
List<String> configurations = this.getCandidateConfigurations(annotationMetadata, attributes);
            configurations = this.removeDuplicates(configurations);

利用加载工厂默认扫描我们当前系统里面所有META-INF/spring.factories位置的文件

特别是spring-boot-autoconfigure-2.3.4.RELEASE.jar包里的META-INF/spring.factories
里面默认写死了134个配置类,文件里面写死了spring-boot一启动就要给容器中加载的所有配置类,
虽然自动加载,但是实际上按照条件装配规则(@Conditional),最终会按需配置。





posted @ 2021-10-02 19:51  笑^O^  阅读(55)  评论(0)    收藏  举报