SpringBoot自动装配原理和SpringBoot的启动

40 阅读2分钟

SpringBoot自动装配原理和SpringBoot的启动

一.SpringBoot比起Spring的优势在哪里?

​ Spring Boot 是 Spring 框架的扩展,其核心目标是通过约定优于配置自动化机制显著提升开发效率。

​ Spring Boot 比起Spring没有那么多复杂的配置文件,只需要添加对应的依赖和注解就行.

image-20250720194209715.png

SpringBoot自动装配原理

​ 在SpringBoot的启动类上有一个启动类注解@SpringBootApplication,这是一个复合注解,里面封装了两个注解:@SpringBootConfiguration和@EnableAutoConfiguration.

​ @SpringBootConfiguration:这个注解里面封装了一个@Configuration注解,表示该启动类是一个配置类,可以在启动类

定义一些Bean.

​ @EnableAutoConfiguration:这也是一个复合注解,里面封装了两个注解@AutoConfigurationPackage和@Import注解,其中@Import注解里放了一个AutoConfigurationImportSelector.class类,这个类有一个方法selectImports(),该方法能够返回一个字符串数组,这个数组里放了一些Bean的全类名.

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

​ 而字符串数组里的内容是通过getAutoConfigurationEntry()获得的,getAutoConfigurationEntry方法里调用了getCandidateConfigurations方法获得,在getCandidateConfigurations方法中SpringFactoriesLoader会从配置文件META-INF/spring.factories中读取到一些类的全类名,最终会经过getAutoConfigurationEntry()方法进行一系列筛选,最后留下的一些Bean的全类名会放入到字符串数组中.

	protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {
		List<String> configurations = new ArrayList<>(
            //SpringFactoriesLoader方法会从META-INF/spring.factories文件中读取一些Bean的全类名
				SpringFactoriesLoader.loadFactoryNames(getSpringFactoriesLoaderFactoryClass(), getBeanClassLoader()));
		ImportCandidates.load(AutoConfiguration.class, getBeanClassLoader()).forEach(configurations::add);
		Assert.notEmpty(configurations,
				"No auto configuration classes found in META-INF/spring.factories nor in META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports. If you "
						+ "are using a custom packaging, make sure that file is correct.");
		return configurations;
	}

​ 而在Spring启动时,会执行run方法,run方法首先会从 META-INF/spring.factories 加载 ApplicationContextInitializerApplicationListener创建**SpringApplication** 实例,然后解析 application.properties确认当前运行环境,然后根据Spirng的应用类型不同确认上下文类型例如Servlet应用的上下文AnnotationConfigServletWebServerApplicationContext.

​ 接下来Spring会进行上下文的初始化,通过 @ComponentScan 扫描主类所在包及其子包的组件,初始化之后会刷新上下文**refreshContext,在这一步中,Spring会完成BeanFactory的创建并注册标准Bean,并进行Auto-configuration**自动配置,这里Spring会通过条件注解(如 @ConditionalOnClass)筛选有效配置,最后按照顺序创建Bean.