自动配置原理:
@SpringBootApplication( SpringBoot应用程序 ):
1:@SpringBootConfiguration ( SpringBoot配置 )
2:@EnableBootConfiguration ( SpringBoot自动配置 )
( 1 ):@AutoConfigurationPackge ( 自动导入包 )
[ 1 ]:@Import({AutoConfigurationPackages.Registrar.class}) ( 自动注册表 )
( 2 ):@Import({AutoConfigurationImportSelector.class}) ( 自动导包的核心 )
[ 1 ]:AutoConfigurationImportSelector:自动导入选择器
自动导入选择器,选择了什么东西?
{ 1 }:getAutoConfigurationEntry():获取自动配置的实体
{ 2 }:getCandidateConfigurations():获取候选的配置
' 1 ':protected Class<?> getSpringFactoriesLoaderFactoryClass() { return EnableAutoConfiguration.class; }
//标注了EnableAutoConfiguration注解的类
{ 3 }:public static List<String> loadFactoryNames():获取所有的加载配置名字
{ 4 }:loadSpringFactories():获取配置
' 1 ':获取项目资源 classLoader.getResources(FACTORIES_RESOURCE_LOCATION)
在spring-boot-autoconfigure-2.7.5.jar里面获取到配置文件META-INF/spring.factories(所有的自动配置类都在这里)
这么多自动装配为什么有的没有生效呢,需要导入对应的start才能生效
核心注解:@ConditionalOnXXX:如果这里的条件都满足才会生效
' 2 ':获取系统资源 classLoader.getSystemResources(FACTORIES_RESOURCE_LOCATION)
' 3 ':从这些资源中遍历了所有的nextElement( 元素\所有的自动配置 ),遍历完成之后封装为Properties供我们使用
3:@ComponentScan ( 组件扫描 )
结论
SpringBoot所有自动配置都是在启动的时候扫描并加载:spring.factories 所有的自动配置类都在这里,但是所有的自动装配不一定会生效,需要导入对应的start才能生效,因为会通过@ConditionOnXXX注解判断条件是否成立,如果没有导入对应的start就不会有对应的启动器,自动装配就不会失效,配置就不会成功,反之。
1:SpringBoot在启动的时候,从类路径下/META-INF/spring.factories获取指定的值;
2:将这些自动配置的类导入容器,自动装配就会生效,进行自动配置;
3:以前自己配置的东西现在SpintBoot帮我们做;
4:整合javaEE,解决方案和自动配置的东西都在spring-boot-autoconfigure.jar包里;
5:它会把所有需要导入的组件,以类名的方式返回,这些组件就会发送到容器;
6:容器中也会存在非常多的xxxAutoConfiguration的文件(@Bean),就是这些类给容器中导入了这个场景需要的所有组件并自动配置 @Configuration,JavaConfig;