前言
大概10來年以前,當時springboot剛剛出現并沒有流行,當時的Java開發者們開發Web應用主要是使用spring整合springmvc或者struts、iBatis、hibernate等開發框架來進行開發。項目里一般有許多xml文件配置,其中配置了很多項目中需要用到的Bean,掃描的路徑等等,類似下面這樣:
看起來很麻煩,但是相比于讓我們自己在代碼里自己構建各種對象,自己的set各種屬性,自己維護大量對象的依賴關系使用,這樣預先配置交給Spring管理,后續采用依賴注入的方式在需要的地方拿來使用的方式,已經是相當的舒服了。
SpringBoot
SpringBoot框架的命名關鍵在"Boot"上,或許Boot Spring更能說明這個微框架設計的初衷,也就是快速啟動一個Spring應用。快在哪里呢,這里如果我們要在項目里整合Redis,則只需要添加如下的依賴:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
然后添加上redis的連接參數,就可以需要操作Redis的地方注入RedisTemplate對象來使用了,不需要在xml中配置RedisConnectionFactory
、RedisTemplate
等相關依賴的類了。
spring-boot-autoconfigure
這里有個比較關鍵的依賴spring-boot-autoconfigure
,里面有一個RedisAutoConfiguration
@Configuration(proxyBeanMethods = false)
@ConditionalOnClass(RedisOperations.class)
@EnableConfigurationProperties(RedisProperties.class)
@Import({ LettuceConnectionConfiguration.class, JedisConnectionConfiguration.class })
public class RedisAutoConfiguration {@Bean@ConditionalOnMissingBean(name = "redisTemplate")public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory)throws UnknownHostException {RedisTemplate<Object, Object> template = new RedisTemplate<>();template.setConnectionFactory(redisConnectionFactory);return template;}@Bean@ConditionalOnMissingBeanpublic StringRedisTemplate stringRedisTemplate(RedisConnectionFactory redisConnectionFactory)throws UnknownHostException {StringRedisTemplate template = new StringRedisTemplate();template.setConnectionFactory(redisConnectionFactory);return template;}
}
這里的@ConditionalOnClass是一個基于條件的配置,在滿足條件時會加載當前配置類,類似的注解在org.springframework.boot.autoconfigure.condition
包下還有許多,例如:
@ConditionalOnClass
@ConditionalOnBean
@ConditionalOnMissingClass
@ConditionalOnMissingBean
@ConditionalOnProperty
…
有了這些注解的配合,我們就可以結合@EnableAutoConfigurationn實現基于條件的自動配置了。
SpringBoot之所以能夠流行,很大一部分功勞需要歸功于它預先提供的一系列自動配置的依賴模塊,而這些依賴模塊都是基于以上注解實現的,這也意味著所有的這些依賴模塊都是按需加載的,只有符合某些特定條件,這些依賴模塊才會生效,這也就是我們所謂的“智能”自動配置。
spring.factories
例如以上redis自動配置的例子,這里只要環境中有RedisOperations
就會自動配置Redis相關類,你可以在這個自動配置類附近找到許多這樣的xxxxAutoConfiguration,很多組建都可以類似這樣通過引入依賴后直接使用,但是如果只有自動配置類的話,其實這個類也不會被加載,因為我們在啟動SpringBoot應用時,使用的@SpringBootApplication注解,他只會自動掃描當前包以及子包下的類,如果掃描不到自然也不會加載了,所以這里還要配合META-INF/spring.factories
文件,文件中配置了所有需要被掃描到的自動裝配類,SpringBoot應用啟動時,會由SpringFactoriesLoader
取讀取該文件加載,這里比較像Java SPI機制,對Java SPI感興趣也可以看看這篇博文:Java SPI機制介紹及原理分析
以上就是SpringBoot核心功能Starter的一個介紹,下一篇博文(實現一個自己的spring-boot-starter,基于SQL生成HTTP接口)我會基于這個原理實現一個自己的SpringBootStarter模塊,只要引入了該模塊,項目就自然具有了通過配置SQL自動生成Http接口的能力。