大家眼中的spring boot:https://www.zhihu.com/question/39483566
-------------------------------------------------------------------------
Spring Boot是由spring官方(Pivotal團隊)在2013年提供的全新框架,其設計目的是用來簡化新Spring應用的初始搭建以及開發過程。該框架使用了特定的方式來進行配置,從而使開發人員不再需要定義樣板化的配置。用我的話來理解,就是spring boot其實不是什么新的框架,它默認配置了很多框架的使用方式,就像maven整合了所有的jar包,spring boot整合了所有的框架。
至於spring boot的好處,我的感受就是少了xml,幾乎是零配置,項目搭建非常容易。原來搭建一個項目,要引入spring,然后根據spring版本引入orm框架等,要在xml中配置一些基本的比如掃描包路徑,數據連接池,orm相關配置,事務配置等一些內容,有些配置根據使用spring或者jar包版本的不同略有差別。spring boot就不用這么麻煩了,要用啥直接引入相關的starter就行了。說起來,當年我們java bean相互依賴,直接new,然后spring說大家太辛苦了,這事兒我來,大家xml配一下就好;后來jdk出了注解以后,spring覺着也不錯,就也來了一下,支持了很多注解,說大家xml是不是很辛苦啊,建議使用注解吆,記得當時還有人爭論是xml好還是注解好,現在算是塵埃落定了;然后spring不斷挑戰自己,雖然xml加注解已經挺好使的了,它對自己還真得挺狠,完全把xml干掉了,全部注解,這就是boot了。哈哈。
當然,spring boot也不全是優點,個人感覺上,正是因為starter的自動配置啥都替我們做了,有的時候我們並不需要一些內容,starter也幫我們引入做好了,導致的結果就是最后的工程打包后體積比原來大了好多;還有就是,啥都約定好了,這么寫就行,給了我們發懶的借口,讓人不去考慮底層實現,這點作為開發人員還是要警惕的,清楚底層的實現邏輯是一個碼農對自己最基礎的要求,切記切記。
-------------------------------------------------------------------------
Spring Boot的核心功能:
1、獨立運行spring 項目
Spring Boot可以以jar包形式獨立運行,運行一個Spring Boot項目只需要通過java -jar xx.jar來運行就可以;
2、內嵌servlet容器
spring boot自帶了tomcat,jetty跟undertow,這樣我們就無需以war包形式部署項目;
3、提供starter簡化maven配置
提供了一系列的starter pom來簡化maven配置,看起來pom文件內容少了很多;
4、自動配置spring
Spring Boot會根據在類路徑中的jar包、類,為jar包里的類自動配置bean,這會極大地減少我們要使用的配置;當然,spring boot只是考慮了大部分場景,實際開發中仍會有需要我們自己配置的bean;
5、准生產的應用監控
Spring Boot提供基於http、ssh跟telnet對運行時的項目進行監控;
6、無xml配置
Spring 4.x提供了條件注解,在Spring Boot中可以不用任何xml即可實現spring的所有配置;原理參見@enable注解跟@import注解;
使用介紹:
Spring Boot通常有一個名為*Application的入口類,入口類里有一個main方法,這個main方法其實就是一個標准的java應用程序入口方法;在main方法中使用SpringApplication.run() 啟動Spring Boot應用項目。
@SpringBootApplication是Spring Boot的核心注解,它是一個組合注解,部分源碼為:
@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 { @AliasFor( annotation = EnableAutoConfiguration.class, attribute = "exclude" ) Class<?>[] exclude() default {}; }
主要集成的注解是@Configuration、@EnableAutoConfiguration跟@ComponentScan,若不使用@SpringBootApplication也可以在入口類使用以上三個注解;其中@EnableAutoConfig讓Spring Boot根據類路徑中的jar包依賴,為當前項目進行自動配置。
Spring Boot會自動掃描@SpringBootApplication所在類的同級包以及下級包里的bean,建議入口類放置在groupId+arctifactID組合的包名下;
關閉特定的自動配置,應使用@SpringBootApplication注解的exclude參數,例如:
@SpringBootApplication(exclude={DataSourceAutoConfiguration.class})
Spring Boot的運行原理:
Spring Boot關於自動配置的源碼都在spring-boot-autoconfigure-1.5.9.x.jar中,主要包含了如下配置:
有必要的時候,我們可以來這里查看源碼。
我們可以通過如下方式查看項目中已啟用和未啟用的自動配置報告:
1、運行jar時加--debug參數
java -jar xx.jar --debug
2、在application.properties中設置熟悉:
debug==true
原理原理,還是繼續看原理,入口注解是@SpringBootApplication,它的核心功能是由@EnableAutoConfiguration這個注解提供的,源碼:
@Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented @Inherited @AutoConfigurationPackage @Import({EnableAutoConfigurationImportSelector.class}) public @interface EnableAutoConfiguration { String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration"; Class<?>[] exclude() default {}; String[] excludeName() default {}; }
這里的關鍵功能是@Import注解導入的配置功能,EnableAutoConfigurationImportSelector使用SpringFactoriesLoader.loadFactoryNames方法來掃描具有META-INF/spring.factories文件的jar包,而我們的spring-boot-autoconfigure-1.5.9.jar里就有一個spring.factories文件,此文件聲明了我們有哪些自動配置:
打開其中任意一個AutoConfiguration文件,一般都有一些如下類似的條件注解,比如@ConditionalOnBean(當容器里有指定的bean的條件下),@ConditionalOnClass(當類路徑下有指定的類的條件下),@ConditionalOnJava(基於jvm版本作為判斷條件)等等;
這些注解都組合了@Conditional元注解,只是使用了不同的條件,在不同情況下自動注冊不同的實例到ioc容器中。
--------------------------------------------------
稍后手寫一個starter來加深理解