SpringBoot的启动原理

发布于:2024-07-27 ⋅ 阅读:(143) ⋅ 点赞:(0)

1、@SpringBootApplication注解

启动类注解,该注解包含下面三个注解:

@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
		@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {
//省略
}

2、@SpringBootConfiguration

几乎和@Configuration注解没有区别,标识这是一个配置类。

3、@EnableAutoConfiguration

从classpath中搜寻所有的META-INF/spring.factories配置文件,并将其中
org.springframework.boot.autoconfigure.EnableAutoConfiguration对应的配置项通过反射实例化为对应的标注了@Configuration的lOC容器配置类,然后汇总为一个,并加载到loC容器。

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {

	/**
	 * Environment property that can be used to override when auto-configuration is
	 * enabled.
	 */
	String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration";

	/**
	 * Exclude specific auto-configuration classes such that they will never be applied.
	 * @return the classes to exclude
	 */
	Class<?>[] exclude() default {};

	/**
	 * Exclude specific auto-configuration class names such that they will never be
	 * applied.
	 * @return the class names to exclude
	 * @since 1.3.0
	 */
	String[] excludeName() default {};

}

该注解包含下面两个个注解:

  • @AutoConfigurationPackage:

   

  • @Import(AutoConfigurationImportSelector.class):

  1. @EnableAutoConfiguration注解导入了AutoConfigurationImportSelector类,它负责查找所有的配置类。

  2. AutoConfigurationImportSelector类中的selectImports方法会查询META-INF/spring.factories文件,这个文件列出了所有Spring Boot的自动配置类【原理参考扩展中的5.1】。

  3. 对于每一个自动配置类,Spring会检查@Conditional注解,只有满足条件的配置类才会被实例化。

#AutoConfigurationImportSelector源码:

public class AutoConfigurationImportSelector implements DeferredImportSelector, BeanClassLoaderAware,
		ResourceLoaderAware, BeanFactoryAware, EnvironmentAware, Ordered {
    @Override
	public String[] selectImports(AnnotationMetadata annotationMetadata) {
		if (!isEnabled(annotationMetadata)) {
			return NO_IMPORTS;
		}
		AutoConfigurationEntry autoConfigurationEntry = getAutoConfigurationEntry(annotationMetadata);
		return StringUtils.toStringArray(autoConfigurationEntry.getConfigurations());
	}

    protected AutoConfigurationEntry getAutoConfigurationEntry(AnnotationMetadata annotationMetadata) {
		if (!isEnabled(annotationMetadata)) {
			return EMPTY_ENTRY;
		}
		AnnotationAttributes attributes = getAttributes(annotationMetadata);
		List<String> configurations = getCandidateConfigurations(annotationMetadata, attributes);
		configurations = removeDuplicates(configurations);
		Set<String> ex

网站公告

今日签到

点亮在社区的每一天
去签到