SpringBoot學習筆記

SpringBoot學習筆記

春節期間,對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

相關文章
相關標籤/搜索