从源码角度分析SpringBoot自动装配流程原理:
什么是SpringBoot的自动装配?
在传统的 Java 开发中,我们需要自己管理对象之间的依赖关系,通过创建对象实例并将其注入到其他对象中。这种方式需要编写大量的样板代码,而且在应用程序的规模变大时,维护和管理这些依赖关系会变得非常复杂。而SpringBoot的自动装配可以通过条件化配置和自动发现机制,根据项目依赖和类路径信息自动配置应用程序,简化开发者的配置工作,提供零配置的开发体验,同时兼具灵活性和可扩展性,帮助开发者快速搭建并部署应用程序。
在SpringBoot中,自动装配是通过注解来实现的。
SpringBoot自动装配核心注解:
SpringBoot中涉及到自动装配的注解有:@SpringBootApplication、@EnableAutoConfiguration、@ComponentScan。
@SpringBootApplication:
用于标识主启动类,整合了@Configuration、@EnableAutoConfiguration和@ComponentScan的功能。
@EnableAutoConfiguration:
实现SpringBoot自动装配的核心注解,用于启用Spring Boot的自动配置机制,根据类路径和项目依赖自动配置应用程序。
@ComponentScan:
扫描指定包及其子包下的组件,将其注册为Spring Bean。
结合源码分析:
要分析SpringBoot自动装配源码,就要重点关注其核心注解@EnableAutoConfiguration
该注解位于@SpringBootApplication中
通过翻阅源码我们可以看到
这个注解import了一个叫做AutoConfigurationImportSelector的类,这个类就是实现自动装配的核心,我们进入这个类分析它的源码:
这个类有一个核心方法叫做selectImports(),我们需要重点关注这个方法。
我们可以看到这个方法做的具体的工作就是把元数据通过getAutoConfiguration()转化为一个Entry对象,这个Entry对象存放着自动配置的条目或条目集合,我们看看它是如何生成的:
getAutoConfiguration()主要是通过getCandidateConfigurations()来获取所有需要自动装配的类的全限定类名,具体是通过classLoader去扫描并获取每个Jar包下的META-INF/spring.factories里的内容。
SpringBoot获取到这些全类名后就会经过一系列处理并最终实例化加载到IOC容器中。
总结:
@SpringBootApplication复合注解-->@EnableAutoConfiguration复合注解
@EnableAutoConfiguration注解中导入(@Import({AutoConfigurationImportSelector.class}))注解
AutoConfigurationImportSelector类selectImports()方法-->getAutoConfigurationEntry()方法-->getCandidateConfigurations()方法
getCandidateConfigurations借助SpringFactoriesLoader.loadFactoryNames()扫描META-INF/spring.factories的jar包,把扫描到的全类名进行实例化加载到IOC容器中