春節期間,對SpringBoot作了一些學習,記錄點心得。
SpringBoot是Spring發展史的一個新的起點,有很是多新的特性。其中最重要的特性是自動化,原先咱們在Spring中不少的Config類及Bean的定義都不須要了,是個很是大的優勢。java
讓咱們從Maven配置開始,已經最大程度簡化了。從下面的配置中,咱們能夠看到依賴中不包含版本信息,由於SpringBoot很是好的作了測試,對應版本都是可用的。若是須要使用更高的版本,須要進行下測試。
須要注意的是,SpringBoot默認不包含MyBatis,須要單獨添加。web
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-websocket</artifactId> </dependency> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>1.1.1</version> </dependency>
SpringBoot應用都是從SpringBootApplication這個註解開始,其代碼以下,咱們分析下其內部特性。spring
@Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Inherited @SpringBootConfiguration @EnableAutoConfiguration @ComponentScan(excludeFilters = @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class)) public @interface SpringBootApplication { Class<?>[] exclude() default {}; String[] excludeName() default {}; @AliasFor(annotation = ComponentScan.class, attribute = "basePackages") String[] scanBasePackages() default {}; @AliasFor(annotation = ComponentScan.class, attribute = "basePackageClasses") Class<?>[] scanBasePackageClasses() default {}; }
@SpringBootConfiguraion就是標準的配置,裏面直接能夠定義Bean,但須要知道的是一個SpringBoot只能出現一次這個註解。tomcat
@ComponetScan默認掃描相同包下的Bean,若是是其餘的就須要配置。能夠加一些簡單的過濾去,選擇或者排除掉一些特定的Bean。springboot
@EnableAutoConfiguration最爲關鍵,下面會詳述。服務器
@EnableAutoConfiguration,這個是SpringBoot的核心:自動配置。
簡單來講,若是咱們的程序包裏包含了某個class,把某一個jar包放進來,Spring會猜想咱們但願用到裏面的某些Bean。這個時候,SpringBoot就會定義一個Config的配置,把jar包裏的Bean定義好,而後能夠自動的納進來。就是說咱們不用定義Bean了,也不用寫Config文件。SpringBoot就自動加載進來,好處是已經作了好多的現成模塊能夠用。websocket
其機制是經過定義一個Configuration的class,裏面能夠經過配置,將其餘的Configuration引入進來。在jar包下META-INF/spring.factories文件裏面會定義的是接口類和接口實現類。已經實現的引入都存放在spring-boot-autoconfigure下面,默認引入很是多有100多個,基本開發中的常見模塊都包括了,這個配置是提早作好的,是標準化和最優化的,能夠參考來學習。下面是部分片斷的示例。mybatis
Initializers
org.springframework.context.ApplicationContextInitializer= org.springframework.boot.autoconfigure.SharedMetadataReaderFactoryContextInitializer, org.springframework.boot.autoconfigure.logging.AutoConfigurationReportLoggingInitializer
Application Listeners
org.springframework.context.ApplicationListener= org.springframework.boot.autoconfigure.BackgroundPreinitializer
Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration= org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration, org.springframework.boot.autoconfigure.aop.AopAutoConfiguration,
下面看一下Spring Web的配置示例,是比較複雜的,但同時將本地環境和生產環境的狀況都考慮了進去。能夠稱之爲一種最佳實踐。
@ConditionalOnWebApplication表示只有在web服務器纔會加載。
而且沒有定義Tomcat工廠類,且存在Tomcat.class和Servlet.class,就自動建立。框架
@AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE) @Configuration @ConditionalOnWebApplication @Import(BeanPostProcessorsRegistrar.class) public class EmbeddedServletContainerAutoConfiguration { /** * Nested configuration if Tomcat is being used. */ @Configuration @ConditionalOnClass({ Servlet.class, Tomcat.class }) @ConditionalOnMissingBean(value = EmbeddedServletContainerFactory.class, search = SearchStrategy.CURRENT) public static class EmbeddedTomcat { @Bean public TomcatEmbeddedServletContainerFactory tomcatEmbeddedServletContainerFactory() { return new TomcatEmbeddedServletContainerFactory(); } } }
SpringBoot的核心思想簡單來講就是不重複造輪子,主要針對原先在工程中比較繁瑣的依賴和配置管理的工做,無侵入式的實現也很是符合Spring的傳統哲學。
整個框架既不智能,也沒有真正的自動化,但經過最佳實踐的積累和框架的包裝,提供了一種拿來即用的工做方式。易用性是框架生命力的重要來源,尤爲對於初學者來講,會產生很是大的幫助。socket