SpringBoot自动配置与源码分析

SpringBoot

boot是启动的意思,所以,可以说springBoot是一个启动spring项目的一个工具,这个工具简化了spring的配置。

SpringBoot相较于Spring的优势

1.自动配置;使用Starter组件简化依赖管理。

2.内嵌的Servlet容器。

3.默认采用Maven作为构建工具。

在探索SpringBoot自动配置之前,先了解下什么是自动配置。

自动配置

所谓自动配置,可以理解为你声明了依赖,SpringBoot会自动配置相关依赖的组件,这些自动配置的组件可以在Spring应用程序中直接使用,无需手动配置。

举个例子:

引入了spring-boot-starter-data-redis依赖,我们可以直接通过 Autowired 注解自动从容器里面拿到相应的RedisTemplate对象。

SpringBoot自动配置与源码分析_第1张图片

源码分析

接下来看看SpingBoot代码中自动配置是如何实现的

SpringBoot自动配置与源码分析_第2张图片

@SpringBootApplication注解告诉SpringBoot这是一个SpringBoot应用程序的入口点。

点击进入注解@SpringBootApplication里面查看

SpringBoot自动配置与源码分析_第3张图片

@SpringBootConfiguration注解告诉SpringBoot,此类是主配置类,提供了应用程序配置,等价于Spring 的配置文件bean.xml

@ComponentScan注解用于指定Spring Boot自动扫描的包路径,以查找和注册组件、服务、配置类等。它默认会扫描主配置类所在的包及其子包中的组件(@Component、@Repository、@Service、@Controller、@Configuration等)。

@EnableAutoConfiguration注解:这个注解启用了SpringBoot的自动配置功能,告诉SpringBoot在指定的包路径下查找自动配置类,并加载它们到应用程序中。这些自动配置类通常是实现Spring Boot自动配置功能的组件,例如Spring Boot Starter等。

那么@EnableAutoConfiguration是如何查找和加载配置的呢?

点击进入注解@EnableAutoConfiguration里面查看

SpringBoot自动配置与源码分析_第4张图片

@AutoConfigurationPackage注解不仅会扫描主配置类所在的包及其子包中的组件,还会扫描包路径下定义的自动配置类。主要用于指定自动配置类的包路径。

@Import({AutoConfigurationImportSelector.class})注解: AutoConfigurationImportSelector负责选择和加载自动配置类,将所有符合条件(Spring.factories)的bean定义都加载到当前IOC容器中。

看来重点是关注AutoConfigurationImportSelector做了什么

点击进入AutoConfigurationImportSelector里面查看

SpringBoot自动配置与源码分析_第5张图片

找到selectImports方法:该方法是找配置文件的入口

进入selectImports方法中的getAutoConfigurationEntry方法查看

SpringBoot自动配置与源码分析_第6张图片

进入getAutoConfigurationEntry中的getCandidateConfigurations方法查看,该方法主要是去加载各个组件jar下的 spring.factories文件

看到SpringFactoriesLoader.loadFactoryNames方法和JDK内置的SPI机制中的ServiceLoader.load很类似。

进入SpringFactoriesLoader类对象

SpringBoot自动配置与源码分析_第7张图片

可以看到查找是从 META-INF/spring.factories 路径查找自动配置的。

SpringFactoriesLoader的底层原理其实就是借鉴于JDK的SPI机制。在这里,是Spring框架提供的一种扩展机制,用于实现框架的可拓展性。SPI机制一种解耦非常优秀的思想。

你可能感兴趣的:(SpringBoot,spring,boot,后端,java)