javascript
SpringBoot 源码解析 (一)----- SpringBoot核心原理入门
目錄
Spring Boot 概述
什么是 Spring Boot
使用 Spring Boot 有什么好處
Spring Boot HelloWorld
導入依賴spring boot相關的依賴
編寫主程序
編寫Controller、Service
運行主程序測試
Hello World探究
POM文件
啟動器
主程序類(主入口類)
Spring Boot 概述
Build Anything with Spring Boot:Spring Boot is the starting point for building all Spring-based applications. Spring Boot is designed to get you up and running as quickly as possible, with minimal upfront configuration of Spring.
上面是引自官網的一段話,大概是說: Spring Boot 是所有基于 Spring 開發的項目的起點。Spring Boot 的設計是為了讓你盡可能快的跑起來 Spring 應用程序并且盡可能減少你的配置文件。
什么是 Spring Boot
它使用 “習慣優于配置” (項目中存在大量的配置,此外還內置一個習慣性的配置,讓你無須手動配置)的理念讓你的項目快速運行起來。
它并不是什么新的框架,而是默認配置了很多框架的使用方式,就像 Maven 整合了所有的 jar 包一樣,Spring Boot 整合了所有框架
使用 Spring Boot 有什么好處
回顧我們之前的 SSM 項目,搭建過程還是比較繁瑣的,需要:
1)配置 web.xml,加載 spring 和 spring mvc
2)配置數據庫連接、配置日志文件
3)配置家在配置文件的讀取,開啟注解
4)配置mapper文件
…
而使用 Spring Boot 來開發項目則只需要非常少的幾個配置就可以搭建起來一個 Web 項目,并且利用 IDEA 可以自動生成生成
劃重點:簡單、快速、方便地搭建項目;對主流開發框架的無配置集成;極大提高了開發、部署效率。
回到頂部
Spring Boot HelloWorld
導入依賴spring boot相關的依賴
4.0.0
/**
-
@SpringBootApplication來標注一個主程序類,說明這是一個SpringBoot應用
*/
@SpringBootApplication
public class HelloWorldMainApplication {public static void main(String[] args) {
//Spring應用啟動
SpringApplication.run(HelloWorldMainApplication.class, args);
}
}
編寫Controller、Service
@RestController
public class HelloController {
}
運行主程序測試
使用maven打包命令將其打包成jar包后,直接使用命令:
java -jar xxx.jar
回到頂部
Hello World探究
POM文件
父項目
該父項目是真正管理Spring Boot應用里面的所有依賴的版本:Spring Boot的版本仲裁中心,所以以后導入的依賴默認是不需要版本號。如下
還有很多版本號沒有截圖出來
啟動器
org.springframework.boot
spring-boot-starter-web
? spring-boot-starter : spring boot場景啟動器;幫助導入web模塊正常運行所依賴的組件;
? Spring Boot將所有的功能場景抽取出來,做成一個個的starter(啟動器),只需要在項目中引入這些starter,那么相關的場景的所有依賴都會導入進項目中。要用什么功能就導入什么場景的啟動器。
org.springframework.boot spring-boot-starter-tomcat org.springframework spring-web org.springframework spring-webmvc添加了 spring-boot-starter-web 依賴,會自動添加 Tomcat 和 Spring MVC 的依賴
spring-boot-starter-web中又引入了spring-boot-starter-tomcat
@SpringBootApplication
public class HelloWorldMainApplication {
}
@SpringBootApplication
Spring Boot應用標注在某個類上,說明這個類是SpringBoot的主配置類,SpringBoot就應該運行這個類的main方法來啟動SpringBoot應用。
注解定義如下:
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = {
@Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {}
@SpringBootConfiguration
Spring Boot的配置類
標注在某個類上,表示這是一個Spring Boot的配置類
注解定義如下:
@Configuration
public @interface SpringBootConfiguration {}
其實就是一個Configuration配置類,意思是HelloWorldMainApplication最終會被注冊到Spring容器中
@EnableAutoConfiguration
開啟自動配置功能
以前使用Spring需要配置的信息,Spring Boot幫助自動配置;
@EnableAutoConfiguration通知SpringBoot開啟自動配置功能,這樣自動配置才能生效。
注解定義如下:
@AutoConfigurationPackage
@Import(EnableAutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {}
@AutoConfigurationPackage
自動配置包注解
@Import(AutoConfigurationPackages.Registrar.class)
public @interface AutoConfigurationPackage {}
@Import(AutoConfigurationPackages.Registrar.class):默認將主配置類(@SpringBootApplication)所在的包及其子包里面的所有組件掃描到Spring容器中。如下
@Order(Ordered.HIGHEST_PRECEDENCE)
static class Registrar implements ImportBeanDefinitionRegistrar, DeterminableImports {
}
@Import(EnableAutoConfigurationImportSelector.class)
EnableAutoConfigurationImportSelector: 導入哪些組件的選擇器,將所有需要導入的組件以全類名的方式返回,這些組件就會被添加到容器中。
//EnableAutoConfigurationImportSelector的父類:AutoConfigurationImportSelector
@Override
public String[] selectImports(AnnotationMetadata annotationMetadata) {
if (!isEnabled(annotationMetadata)) {
return NO_IMPORTS;
}
try {
AutoConfigurationMetadata autoConfigurationMetadata = AutoConfigurationMetadataLoader
.loadMetadata(this.beanClassLoader);
AnnotationAttributes attributes = getAttributes(annotationMetadata);
List configurations = getCandidateConfigurations(annotationMetadata, attributes);
configurations = removeDuplicates(configurations);
configurations = sort(configurations, autoConfigurationMetadata);
Set exclusions = getExclusions(annotationMetadata, attributes);
checkExcludedClasses(configurations, exclusions);
configurations.removeAll(exclusions);
configurations = filter(configurations, autoConfigurationMetadata);
fireAutoConfigurationImportEvents(configurations, exclusions);
return configurations.toArray(new String[configurations.size()]);
}
catch (IOException ex) {
throw new IllegalStateException(ex);
}
}
我們主要看第11行List configurations = getCandidateConfigurations(annotationMetadata, attributes);會給容器中注入眾多的自動配置類(xxxAutoConfiguration),就是給容器中導入這個場景需要的所有組件,并配置好這些組件。我們跟進去看看
protected List getCandidateConfigurations(AnnotationMetadata metadata,
AnnotationAttributes attributes) {
List configurations = SpringFactoriesLoader.loadFactoryNames(
getSpringFactoriesLoaderFactoryClass(), getBeanClassLoader());
//…
return configurations;
}
protected Class<?> getSpringFactoriesLoaderFactoryClass() {
return EnableAutoConfiguration.class;
}
public static final String FACTORIES_RESOURCE_LOCATION = “META-INF/spring.factories”;
public static List loadFactoryNames(Class<?> factoryClass, ClassLoader classLoader) {
String factoryClassName = factoryClass.getName();
try {
//從類路徑的META-INF/spring.factories中加載所有默認的自動配置類
Enumeration urls = (classLoader != null ? classLoader.getResources(FACTORIES_RESOURCE_LOCATION) :
ClassLoader.getSystemResources(FACTORIES_RESOURCE_LOCATION));
List result = new ArrayList();
while (urls.hasMoreElements()) {
URL url = urls.nextElement();
Properties properties = PropertiesLoaderUtils.loadProperties(new UrlResource(url));
//獲取EnableAutoConfiguration指定的所有值,也就是EnableAutoConfiguration.class的值
String factoryClassNames = properties.getProperty(factoryClassName);
result.addAll(Arrays.asList(StringUtils.commaDelimitedListToStringArray(factoryClassNames)));
}
return result;
}
catch (IOException ex) {
throw new IllegalArgumentException(“Unable to load [” + factoryClass.getName() + “] factories from location [” + FACTORIES_RESOURCE_LOCATION + “]”, ex);
}
}
SpringBoot啟動的時候從類路徑下的 META-INF/spring.factories中獲取EnableAutoConfiguration指定的值,并將這些值作為自動配置類導入到容器中,自動配置類就會生效,最后完成自動配置工作。EnableAutoConfiguration默認在spring-boot-autoconfigure這個包中,如下圖
最終有96個自動配置類被加載并注冊進Spring容器中
J2EE的整體整合解決方案和自動配置都在spring-boot-autoconfigure-xxx.jar中。在這些自動配置類中會通過@ConditionalOnClass等條件注解判斷是否導入了某些依賴包,從而通過@Bean注冊相應的對象進行自動配置。后面我們會有單獨文章講自動配置的內容
總結
以上是生活随笔為你收集整理的SpringBoot 源码解析 (一)----- SpringBoot核心原理入门的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: hashmap 判断key是否存在
- 下一篇: SpringBoot配置嵌入式Servl