springboot 源码初读
启动文件
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
@MapperScan("com.example.demo.mapper")
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
这个主类做了一下4件事
1. 推断应用类型是普通项目还是Web项目
2. 查找并加载所有可用初始化器,设置到initializers属性中
3. 找出所有的应用程序监听器,设置到listeners属性中(全局存在的,获取上下文,处理获取的bean)
4. 推断并设置main方法的定义类,找到运行的主体(不知道主类,是没办法加载的)
注解
1@SpringBootApplication
2@SpringBootConfiguration : springboot的配置
3@Configuration :spring的配置类
4 @Component:说明这也是spring的组件
2@EnableAutoConfiguration :自动配置
3@AutoConfigurationPackage: 自动配置包
4@Import({Registrar.class}): 自动配置‘包注册’
3@Import({AutoConfigurationImportSelector.class}):自动导入选择
4 List<String> configurations = this.getCandidateConfigurations(annotationMetadata, attributes); :获取所有配置
4 protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {
List<String> configurations = SpringFactoriesLoader.loadFactoryNames(this.getSpringFactoriesLoaderFactoryClass(), this.getBeanClassLoader());
Assert.notEmpty(configurations, "No auto configuration classes found in META-INF/spring.factories. If you are using a custom packaging, make sure that file is correct.");
return configurations; :获取候选配置
2@ComponentScan :
总结: springboot所有自动配置都是在启动的时候扫描加载的:spring.factories 所有的自动装配类都在这里。但是不一定生效,要判断条件是否成立,只要导入了对应的start,就有对应的启动器,有了启动器,我们自动装配就会生效,ran庵后配置成功!
- springboot在启动的时候,从路径下/META-INF/spring.factories获取指定的值:
- 将这些自动装配的类导入容器,自动装配就会生效,帮我进行自动配置!
- 以前我们需要自动配置的东西,现在springboot帮我们做了
- 整合javaEE,解决方案和自动配置的东西都在spring-boot-autoconfigure-2.2.0RELEAES.jar这个包下
- 他会把所有需要导入的组件,以类名的方式返回,这些组件就会被添加到容器
6.容器中也会存在非常多的xxxAutoConfiguration的文件(@Bean),就是这些类给容器导入了这个场景需要的所有组件
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?