SpringBoot修真秘籍

一、古代篇

在修仙界中,Spring Boot 自动装配之术,犹如炼器炉中的异火,能够将繁杂的配置化作一缕轻烟,让修仙者在构建应用之路上,如履平地,轻松驾驭。

第一章:灵根觉醒------Spring Boot 的诞生

在古老的修仙界,随着灵气的复苏,修仙者们对于法宝的需求日益增长。然而,炼器并非易事,炼制法宝需要选择合适的炼器炉、掌握熟练的炼制步骤。

目前修仙界比较通用的炼器炉有Java、C++、Python、Go等等。而在炼制过程中不少修士都反馈过,非常繁琐的炼制步骤让许多修仙者望而却步。直到有一天,一位名叫Spring的大能,以其深厚的修为,创造出了一种名为"Spring Boot"的神奇异火,从此,修仙者们只需轻轻松松,便能炼制出法宝,无需再为繁杂的炼器步骤所困扰。

第二章:异火点燃------自动装配的奥秘

Spring Boot的核心就是自动装配阵法。修仙者只需遵循一定的灵气流动规则,便能自动完成法宝的装配。这异火,便是 Spring Boot 的注解之力,如 @SpringBootApplication、@EnableAutoConfiguration 等,它们如同仙符一般,贴在法宝之上,便能引导灵气自动流转,完成法宝的炼制。

自动装配的奥秘,便是一枚名为@SpringBootApplication的仙符。

它由更为强大的@EnableAutoConfiguration仙符所构成,

而@EnableAutoConfiguration仙符内又蕴含着@Import仙符。

@Import仙符能装载一小型法阵AutoConfigurationImportSelector,它能够连接到一个被称为spring.factories的神纹法则集。神纹记载了所有配置类的法则。通过反射之镜,能解读所有法则,从而完成了对所有配置类的装配。

第三章:灵材收集------配置的简化

在修仙界,炼制法宝需要收集各种灵材,而在 Spring Boot 的世界里,这些灵材便是各种配置文件。自动装配之术,能够让修仙者将这些灵材简化,甚至无需手动收集,只需在法宝中嵌入特定的灵符,如 application.properties 或 application.yml,便能自动感应灵气,完成配置的收集与整合。

第四章:灵光乍现------应用的启动

当一切准备就绪,修仙者只需轻念咒语,启动法宝,便能看到灵光乍现,法宝运转如飞。在 Spring Boot 中,这便是应用的启动过程。自动装配之术,让这一过程变得异常简单,修仙者无需再为启动法宝而耗费心神,只需专注于修炼,提升自身修为。

二、现代篇

了解SpringBoot自动装配原理从@SpringBootApplication注解开始。

我们可以看到@SpringBootApplication注解的实现其实是一个注解组合,除了几个基本的注解外,最核心的就是@EnableAutoConfiguration

复制代码
    //该注解作用于类、接口(包含注解)、枚举
    @Target(ElementType.TYPE)
    //注解生命周期:被保存到Class文件中,JVM加载Class文件之后仍然存在    
    @Retention(RetentionPolicy.RUNTIME)
    //生成javadoc会把该注解展示出来
    @Documented
    //子类会继承这个注解
    @Inherited
    //标识是SpringBoot配置类
    @SpringBootConfiguration
    //实现自动装配注解
    @EnableAutoConfiguration
    //扫描该类所在包下所有配置类
    @ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
                                     @Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
    public @interface SpringBootApplication {

继续进入@EnableAutoConfiguration注解,它也是一个组合注解。核心注解就是@Import(AutoConfigurationImportSelector.class),@Import注解把AutoConfigurationImportSelector类加载到Spring容器。

复制代码
	@Target(ElementType.TYPE)
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    @Inherited
    //主程序类所在包及所有子包下的组件到扫描到spring容器中
    @AutoConfigurationPackage
    //将AutoConfigurationImportSelector这个类导入到spring容器中
    @Import(AutoConfigurationImportSelector.class)
    public @interface EnableAutoConfiguration {

AutoConfigurationImportSelector类中的核心方法是selectImports

复制代码
public String[] selectImports(AnnotationMetadata annotationMetadata) {
    if (!isEnabled(annotationMetadata)) {
    return NO_IMPORTS;
}
AutoConfigurationEntry autoConfigurationEntry = getAutoConfigurationEntry(annotationMetadata);
return StringUtils.toStringArray(autoConfigurationEntry.getConfigurations());
}

selectImports方法是自动装配的核心实现,主要是读取META-INF/spring.factories文件,加载需要装配的配置类集合

getAutoConfigurationEntry实现加载的方法,进入后可以看到它使用的是getCandidateConfigurations

进入后使用的是SpringFactoriesLoader.loadFactoryNames

loadFactoryNames返回的是loadSpringFactories的结果

可以看到loadSpringFactories中的实现是classLoader.getResources("META-INF/spring.factories")读取META-INF/spring.factories文件中的全限定名。

小结:

1)@SpringBootApplication=>@EnableAutoConfiguration=>@Import实现自动装配

2)面试中问到的spring.factories中的配置项太多,每次启动都要全部加载么?

不是,springboot自动装配会进行条件过滤,满足条件才加载。一般Configuration类中会增加注解来设置加载的条件。

相关推荐
weisian1519 小时前
Java并发编程--33-Redis分布式缓存三大核心架构:主从、哨兵、分片,落地实战与选型
java·redis·缓存·主从架构·哨兵架构·分片架构
清溪5499 小时前
Damn Vulnerable Web Application(中)
后端
清溪5499 小时前
Damn Vulnerable Web Application(上)
后端
APIshop9 小时前
Python 爬虫获取京东商品详情 API 接口实战指南
java·服务器·数据库
wang09079 小时前
Linux性能优化之内存管理基础知识
java·linux·性能优化
掘金码甲哥9 小时前
AI编程智能体登味太浓了,必须治一治!
后端
StackNoOverflow10 小时前
SpringCloud的声明式服务调用 Feign 全面解析
后端·spring·spring cloud
范什么特西10 小时前
idea创建一个普通的Maven项目运行javaweb
java·maven·intellij-idea
木心术110 小时前
RESTful API设计最佳实践:构建可扩展的后端服务
后端·restful
Jooolin10 小时前
把 OpenClaw 接进电商后台之后,我对 AI 落地这件事的理解变了
后端·ai编程