SpringBoot自动配置与源码分析
SpringBootboot是启动的意思,所以,可以说springBoot是一个启动spring项目的一个工具,这个工具简化了spring的配置。SpringBoot相较于Spring的优势1.自动配置;使用Starter组件简化依赖管理。2.内嵌的Servlet容器。3.默认采用Maven作为构建工具。在探索SpringBoot自动配置之前,先了解下什么是自动配置。
SpringBoot
boot是启动的意思,所以,可以说springBoot是一个启动spring项目的一个工具,这个工具简化了spring的配置。
SpringBoot相较于Spring的优势
1.自动配置;使用Starter组件简化依赖管理。
2.内嵌的Servlet容器。
3.默认采用Maven作为构建工具。
在探索SpringBoot自动配置之前,先了解下什么是自动配置。
自动配置
所谓自动配置,可以理解为你声明了依赖,SpringBoot会自动配置相关依赖的组件,这些自动配置的组件可以在Spring应用程序中直接使用,无需手动配置。
举个例子:
引入了spring-boot-starter-data-redis依赖,我们可以直接通过 Autowired 注解自动从容器里面拿到相应的RedisTemplate对象。
源码分析
接下来看看SpingBoot代码中自动配置是如何实现的
@SpringBootApplication注解告诉SpringBoot这是一个SpringBoot应用程序的入口点。
点击进入注解@SpringBootApplication里面查看
@SpringBootConfiguration注解告诉SpringBoot,此类是主配置类,提供了应用程序配置,等价于Spring 的配置文件bean.xml
@ComponentScan注解用于指定Spring Boot自动扫描的包路径,以查找和注册组件、服务、配置类等。它默认会扫描主配置类所在的包及其子包中的组件(@Component、@Repository、@Service、@Controller、@Configuration等)。
@EnableAutoConfiguration注解:这个注解启用了SpringBoot的自动配置功能,告诉SpringBoot在指定的包路径下查找自动配置类,并加载它们到应用程序中。这些自动配置类通常是实现Spring Boot自动配置功能的组件,例如Spring Boot Starter等。
那么@EnableAutoConfiguration是如何查找和加载配置的呢?
点击进入注解@EnableAutoConfiguration里面查看
@AutoConfigurationPackage注解不仅会扫描主配置类所在的包及其子包中的组件,还会扫描包路径下定义的自动配置类。主要用于指定自动配置类的包路径。
@Import({AutoConfigurationImportSelector.class})注解: AutoConfigurationImportSelector负责选择和加载自动配置类,将所有符合条件(Spring.factories)的bean定义都加载到当前IOC容器中。
看来重点是关注AutoConfigurationImportSelector做了什么
点击进入AutoConfigurationImportSelector里面查看
找到selectImports方法:该方法是找配置文件的入口
进入selectImports方法中的getAutoConfigurationEntry方法查看
进入getAutoConfigurationEntry中的getCandidateConfigurations方法查看,该方法主要是去加载各个组件jar下的 spring.factories文件
看到SpringFactoriesLoader.loadFactoryNames方法和JDK内置的SPI机制中的ServiceLoader.load很类似。
进入SpringFactoriesLoader类对象
可以看到查找是从 META-INF/spring.factories 路径查找自动配置的。
SpringFactoriesLoader的底层原理其实就是借鉴于JDK的SPI机制。在这里,是Spring框架提供的一种扩展机制,用于实现框架的可拓展性。SPI机制一种解耦非常优秀的思想。
更多推荐
所有评论(0)