* 查看SpringBoot启动原理
1.SpringBoot启动入口
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class HelloWorldApplication {
public static void main(String[] args) {
SpringApplication.run(HelloWorldApplication.class, args);
}
}
我们开发的任意一个项目,都有相同的启动入口。
其中,我们主要要分析@SpringBootApplication
和SpringApplication.run()
,搞清楚这两个,我觉得SpringBoot启动原理应该可以搞清楚。
2.@SpringBootApplication
Many Spring Boot developers like their apps to use auto-configuration, component scan and be able to define extra configuration on their "application class".
可以看出,一个@SpringBootApplication
注解有自动配置,组建扫描,定义额外配置。
其中,起到关键作用的三个注解:
-
@EnableAutoConfiguration
: 开启自动配置功能 -
@ComponentScan
: -
@SpringBootConfiguration
:SpringBoot配置类
image.png
image.png
2.1 @SpringBootConfiguration
标注在某个类上面,就说明这是SpringBoot的配置类
点击去可以看到@Configuration
。可以查看@configuration介绍
2.2 @EnableAutoConfiguration
开启自动配置功能,将所有符合条件的bean定义自动添加到IOC容器中。点击可看到:
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {
其中@AutoConfigurationPackage
再点进去,可以看到:
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@Import(AutoConfigurationPackages.Registrar.class)
public @interface AutoConfigurationPackage {
}
-
@Import(AutoConfigurationPackages.Registrar.class)
:给容器中导入组件,根据AutoConfigurationPackages.Registrar.class,导入符合的类
image.png
image.png
可以看出来,将标准@SpringBootApplication
所在包下的所有组件扫描到Spring IOC容器中。 -
@Import(AutoConfigurationImportSelector.class)
:给容器中导入组件,根据AutoConfigurationImportSelector选择器选择导入哪些组件添加到Spring IOC容器中。
public class AutoConfigurationImportSelector implements DeferredImportSelector, BeanClassLoaderAware,
ResourceLoaderAware, BeanFactoryAware, EnvironmentAware, Ordered {
···
//判断是否开启自动配置
protected boolean isEnabled(AnnotationMetadata metadata) {
if (getClass() == AutoConfigurationImportSelector.class) {
return getEnvironment().getProperty(EnableAutoConfiguration.ENABLED_OVERRIDE_PROPERTY, Boolean.class, true);
}
return true;
}
protected AutoConfigurationEntry getAutoConfigurationEntry(AutoConfigurationMetadata autoConfigurationMetadata,
AnnotationMetadata annotationMetadata) {
if (!isEnabled(annotationMetadata)) {
return EMPTY_ENTRY;
}
AnnotationAttributes attributes = getAttributes(annotationMetadata);
List<String> configurations = getCandidateConfigurations(annotationMetadata, attributes);
configurations = removeDuplicates(configurations);
Set<String> exclusions = getExclusions(annotationMetadata, attributes);
checkExcludedClasses(configurations, exclusions);
configurations.removeAll(exclusions);
configurations = filter(configurations, autoConfigurationMetadata);
fireAutoConfigurationImportEvents(configurations, exclusions);
return new AutoConfigurationEntry(configurations, exclusions);
}
}





SpringBoot启动的时候将autoconfigure-2.2.5.RELEASE.jar!/META-INF/spring.factories中符合条件的配置类添加到IOC容器中,无需手动配置。
2.3 @ComponentScan
在指定的包中扫描符合条件的组件并添加到IOC容器中。
/*********启动步骤待更新,这里大概了解一下******/
网友评论