SpringBoot學習筆記


SpringBoot學習筆記

春節期間,對SpringBoot做了一些學習,記錄點心得。
SpringBoot是Spring發展史的一個新的起點,有非常多新的特性。其中最重要的特性是自動化,原先我們在Spring中很多的Config類及Bean的定義都不需要了,是個非常大的優點。

初始配置

讓我們從Maven配置開始,已經最大程度簡化了。從下面的配置中,我們可以看到依賴中不包含版本信息,因為SpringBoot非常好的做了測試,對應版本都是可用的。如果需要使用更高的版本,需要進行下測試。
需要注意的是,SpringBoot默認不包含MyBatis,需要單獨添加。

  <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這個注解開始,其代碼如下,我們分析下其內部特性。

@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只能出現一次這個注解。

@ComponetScan默認掃描相同包下的Bean,如果是其他的就需要配置。可以加一些簡單的過濾去,選擇或者排除掉一些特定的Bean。

@EnableAutoConfiguration最為關鍵,下面會詳述。

自動配置

@EnableAutoConfiguration,這個是SpringBoot的核心:自動配置。
簡單來說,如果我們的程序包里包含了某個class,把某一個jar包放進來,Spring會猜測我們希望用到里面的某些Bean。這個時候,SpringBoot就會定義一個Config的配置,把jar包里的Bean定義好,然后可以自動的納進來。就是說我們不用定義Bean了,也不用寫Config文件。SpringBoot就自動加載進來,好處是已經做了好多的現成模塊可以用。

其機制是通過定義一個Configuration的class,里面可以通過配置,將其他的Configuration引入進來。在jar包下META-INF/spring.factories文件里面會定義的是接口類和接口實現類。已經實現的引入都存放在spring-boot-autoconfigure下面,默認引入非常多有100多個,基本開發中的常見模塊都包括了,這個配置是提前做好的,是標准化和最優化的,可以參考來學習。下面是部分片段的示例。

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的傳統哲學。
整個框架既不智能,也沒有真正的自動化,但通過最佳實踐的積累和框架的包裝,提供了一種拿來即用的工作方式。易用性是框架生命力的重要來源,尤其對於初學者來說,會產生非常大的幫助。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM