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一启动就要给容器中加载的所有配置类,
虽然自动加载,但是实际上按照条件装配规则(
 
                    
                
 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号