目錄
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相關的依賴
<?xml version="1.0"encoding="UTF-8"?>4.0.0cn.chenhaospringboot1.0.0-SNAPSHOTjarspringbootDemo project for Spring Bootorg.springframework.bootspring-boot-starter-parent2.0.1.RELEASEorg.springframework.bootspring-boot-starter-weborg.springframework.bootspring-boot-maven-plugin
編寫主程序
/** *@SpringBootApplication來標注一個主程序類,說明這是一個SpringBoot應用 */@SpringBootApplicationpublicclassHelloWorldMainApplication{publicstaticvoidmain(String[] args) {//Spring應用啟動SpringApplication.run(HelloWorldMainApplication.class, args); }}
編寫Controller、Service
@RestControllerpublicclassHelloController{@RequestMapping("/hello")publicString hello(){return"Hello world"; }}
運行主程序測試
使用maven打包命令將其打包成jar包后,直接使用命令:
java -jar xxx.jar
回到頂部
Hello World探究
POM文件
父項目
org.springframework.bootspring-boot-starter-parent2.0.1.RELEASE
其父項目是
org.springframework.bootspring-boot-dependencies2.0.1.RELEASE../../spring-boot-dependencies
該父項目是真正管理Spring Boot應用里面的所有依賴的版本:Spring Boot的版本仲裁中心,所以以后導入的依賴默認是不需要版本號。如下
還有很多版本號沒有截圖出來
啟動器
org.springframework.bootspring-boot-starter-web
??spring-boot-starter?: spring boot場景啟動器;幫助導入web模塊正常運行所依賴的組件;
? Spring Boot將所有的功能場景抽取出來,做成一個個的starter(啟動器),只需要在項目中引入這些starter,那么相關的場景的所有依賴都會導入進項目中。要用什么功能就導入什么場景的啟動器。
org.springframework.bootspring-boot-starter-tomcatorg.springframeworkspring-weborg.springframeworkspring-webmvc
添加了 spring-boot-starter-web 依賴,會自動添加 Tomcat 和 Spring MVC 的依賴
spring-boot-starter-web中又引入了spring-boot-starter-tomcat
主程序類(主入口類)
@SpringBootApplicationpublicclassHelloWorldMainApplication{publicstaticvoidmain(String[] args) {//Spring應用啟動SpringApplication.run(HelloWorldMainApplication.class, args); }}
@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@interfaceSpringBootApplication {}
@SpringBootConfiguration
Spring Boot的配置類
標注在某個類上,表示這是一個Spring Boot的配置類
注解定義如下:
@Configurationpublic@interfaceSpringBootConfiguration {}
其實就是一個Configuration配置類,意思是HelloWorldMainApplication最終會被注冊到Spring容器中
@EnableAutoConfiguration
開啟自動配置功能
以前使用Spring需要配置的信息,Spring Boot幫助自動配置;
@EnableAutoConfiguration通知SpringBoot開啟自動配置功能,這樣自動配置才能生效。
注解定義如下:
@AutoConfigurationPackage@Import(EnableAutoConfigurationImportSelector.class)public@interfaceEnableAutoConfiguration {}
@AutoConfigurationPackage
自動配置包注解
@Import(AutoConfigurationPackages.Registrar.class)public@interfaceAutoConfigurationPackage {}
@Import(AutoConfigurationPackages.Registrar.class):默認將主配置類(@SpringBootApplication)所在的包及其子包里面的所有組件掃描到Spring容器中。如下
@Order(Ordered.HIGHEST_PRECEDENCE)staticclassRegistrarimplementsImportBeanDefinitionRegistrar,DeterminableImports{@OverridepublicvoidregisterBeanDefinitions(AnnotationMetadata metadata,
BeanDefinitionRegistry registry){//默認將會掃描@SpringBootApplication標注的主配置類所在的包及其子包下所有組件register(registry,newPackageImport(metadata).getPackageName()); }@OverridepublicSetdetermineImports(AnnotationMetadata metadata){returnCollections.singleton(newPackageImport(metadata)); }}
@Import(EnableAutoConfigurationImportSelector.class)
EnableAutoConfigurationImportSelector: 導入哪些組件的選擇器,將所有需要導入的組件以全類名的方式返回,這些組件就會被添加到容器中。
1//EnableAutoConfigurationImportSelector的父類:AutoConfigurationImportSelector2@Override3publicString[] selectImports(AnnotationMetadata annotationMetadata) {4if(!isEnabled(annotationMetadata)) {5returnNO_IMPORTS;6}7try{8AutoConfigurationMetadata autoConfigurationMetadata = AutoConfigurationMetadataLoader9.loadMetadata(this.beanClassLoader);10AnnotationAttributes attributes = getAttributes(annotationMetadata);11Listconfigurations= getCandidateConfigurations(annotationMetadata, attributes);12configurations= removeDuplicates(configurations);13configurations=sort(configurations, autoConfigurationMetadata);14Set exclusions = getExclusions(annotationMetadata, attributes);15checkExcludedClasses(configurations, exclusions);16configurations.removeAll(exclusions);17configurations= filter(configurations, autoConfigurationMetadata);18fireAutoConfigurationImportEvents(configurations, exclusions);19returnconfigurations.toArray(newString[configurations.size()]);20}21catch(IOException ex) {22thrownewIllegalStateException(ex);23}24}
我們主要看第11行List<String> configurations = getCandidateConfigurations(annotationMetadata, attributes);會給容器中注入眾多的自動配置類(xxxAutoConfiguration),就是給容器中導入這個場景需要的所有組件,并配置好這些組件。我們跟進去看看
protectedList getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {List configurations = SpringFactoriesLoader.loadFactoryNames( getSpringFactoriesLoaderFactoryClass(), getBeanClassLoader());//...returnconfigurations;}protected Class getSpringFactoriesLoaderFactoryClass() {returnEnableAutoConfiguration.class;}publicstaticfinalStringFACTORIES_RESOURCE_LOCATION ="META-INF/spring.factories";publicstaticList loadFactoryNames(Class factoryClass, ClassLoader classLoader) {StringfactoryClassName = factoryClass.getName();try{//從類路徑的META-INF/spring.factories中加載所有默認的自動配置類Enumeration urls = (classLoader !=null? classLoader.getResources(FACTORIES_RESOURCE_LOCATION) : ClassLoader.getSystemResources(FACTORIES_RESOURCE_LOCATION));List result =newArrayList();while(urls.hasMoreElements()) { URL url = urls.nextElement(); Properties properties = PropertiesLoaderUtils.loadProperties(newUrlResource(url));//獲取EnableAutoConfiguration指定的所有值,也就是EnableAutoConfiguration.class的值StringfactoryClassNames = properties.getProperty(factoryClassName); result.addAll(Arrays.asList(StringUtils.commaDelimitedListToStringArray(factoryClassNames))); }returnresult; }catch(IOException ex) {thrownewIllegalArgumentException("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注冊相應的對象進行自動配置。后面我們會有單獨文章講自動配置的內容
轉發關注小編,私信小編“學習”來免費拿走吧~~~