Spring Boot是一个旨在简化Spring应用程序创建和配置的框架。通过提供大量的自动配置(starter),开发者可以轻松快速地启动和运行一个Spring应用程序。
所有的Spring Boot应用程序都是从SpringApplication
类开始的。以下是SpringApplication
类中启动过程的简化流程。
public class SpringApplication {
private Set<Class<?>> primarySources;
private ApplicationContextInitializer<?>[] initializers;
private ApplicationListener<?>[] listeners;
private boolean webEnvironment;
// SpringApplication构造方法简化示例
public SpringApplication(Class<?>... primarySources) {
this.primarySources = new HashSet<>(Arrays.asList(primarySources));
this.webEnvironment = deduceWebApplicationType();
this.initializers = getSpringFactoriesInstances(ApplicationContextInitializer.class);
this.listeners = getSpringFactoriesInstances(ApplicationListener.class);
}
// SpringApplication.run()简化示例
public ConfigurableApplicationContext run(String... args) {
StopWatch stopWatch = new StopWatch();
stopWatch.start();
ConfigurableApplicationContext context = null;
Collection<SpringBootExceptionReporter> exceptionReporters = new ArrayList<>();
configureHeadlessProperty();
SpringApplicationRunListeners listeners = getRunListeners(args);
listeners.starting();
try {
ApplicationArguments applicationArguments = new DefaultApplicationArguments(args);
ConfigurableEnvironment environment = prepareEnvironment(listeners, applicationArguments);
configureIgnoreBeanInfoProperty();
Banner printedBanner = printBanner(environment);
context = createApplicationContext();
exceptionReporters = getSpringFactoriesInstances(SpringBootExceptionReporter.class,
new Class[] { ConfigurableApplicationContext.class },
context);
prepareContext(context, environment, listeners, applicationArguments, printedBanner);
refreshContext(context);
afterRefresh(context, applicationArguments);
stopWatch.stop();
if (this.logStartupInfo) {
new StartupInfoLogger(this.mainApplicationClass).logStarted(getApplicationLog(), stopWatch);
}
listeners.started(context);
callRunners(context, applicationArguments);
}
catch (Throwable ex) {
handleRunFailure(context, ex, exceptionReporters, listeners);
throw new IllegalStateException(ex);
}
try {
listeners.running(context);
}
catch (Throwable ex) {
handleRunFailure(context, ex, exceptionReporters, null);
throw new IllegalStateException(ex);
}
return context;
}
// 其他方法省略
}
在上述代码中,SpringApplication
类负责启动Spring应用程序,包括初始化上下文、环境以及执行后处理器。
自动配置是Spring Boot的一大特色。通过在spring.factories
中列出的配置类,Spring Boot可以自动配置类路径下的jar包和beans。
Spring Boot的自动配置通过一系列条件注解来实现,这些注解包括@ConditionalOnClass
,@ConditionalOnMissingBean
,@ConditionalOnProperty
等。通过这些注解,Spring Boot在运行时动态地决定是否应该应用特定的配置。
Spring Boot自动配置了内嵌的Web服务器,如Tomcat、Jetty或Undertow。这是通过EmbeddedServletContainerAutoConfiguration
类实现的。
Spring Boot通过DataSourceAutoConfiguration
和JpaRepositoriesAutoConfiguration
自动配置类简化了数据源和JPA仓库的配置过程。
对于安全性配置,Spring Boot提供了SecurityAutoConfiguration
类来自动配置Spring Security。
@ConfigurationProperties
注解允许将外部配置文件中的属性绑定到bean的字段上。
Spring Boot的starters提供了一种快速集成不同技术的方式,比如spring-boot-starter-web
用于Web应用。
要全面理解Spring Boot的工作原理,建议逐步深入其源码,特别是SpringApplication
和SpringFactoriesLoader
的实现,以及特定的自动配置类的实现。
通过将Spring Boot项目导入IDE并结合断点调试器一步步跟踪代码的执行,开发者可以对Spring Boot的工作原理有更深层次的理解。