@SpringBootApplication
注解进去有三个主要注解
1.@SpringBootConfiguration
代表当前是一个配置类, 是对@Configuration
的封装,作用都差不多
2. @ComponentScan
就是一个包扫描
3. 核心:@EnableAutoConfiguration
, 里面主要是这两个注解
3.1: @AutoConfigurationPackage
自动配置包
点击进去看见如下:就是给容器中导入组件
。利用Registrar
给容器中导入一系列组件。
Registrar里面有两个方法, 第一个就是得到一个报名包名, 就是我们当前的启动类所在的包, 然后把这个包下的所有组件注册到容器里面,(就是把我们自己写的组件注册进去
)
3.1: @Import(AutoConfigurationImportSelector.class)
在AutoConfigurationImportSelector
里面主要就是用这个方法个容器中导入组件。
在这个方法里面, 通过这里的get方可以得到133个容器,都叫XXXXAutoConfiguration
查看get方法, 里面使用的是spring的工厂加载器
最终就是利用这个方法给我们加载得到一个mapList
在这个方法里面有一个方法classLoader.getResources
, 这里得到了我们资源加载的路径:里面的参数值是:META-INF/spring.factories
, 所以它会扫描所有有这个路径的包
主要是这个:org.springframework.boot.autoconfigure.EnableAutoConfiguration
这里写死了所有springboot
已启动就要加载的所有组件
虽然这里全部加载了, 但是最后会按需加载:
原因是:我们没有导入相关的包, 我们都没有相关的场景, 所以不能生效,
@ConditionalOnClass
这里代表有Advice.class
这个类的时候, 下面的代码才生效
总结
:springboot启动时候会加载素有的组件, 但是最后会有很多不会生效,只会按需分配。