javascript
Spring Boot————简介与Spring时代的承接
引言
最近,公司正在開發一個景區系統的項目,涉及到Spring Boot框架的使用,在此記錄下Spring Boot框架應該知道的基礎知識。
一、產生
SpringBoot是順應現在微服務(MicroServices)理念而產生的一個微框架(同類還有Dropwizard),用來構建基于Spring框架的標準化的獨立部署應用程序。
二、SpringBoot快速開始:
我們使用Maven構建項目,所以新建一個maven項目, pom.xml中添加如下兩個關鍵因素:
<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>1.2.5.RELEASE</version> </parent> ... <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency> </dependencies>使用spring-boot-starter-parent作為當前項目的parent可以享受到spring boot應用相關的一系列依賴(dependency), 插件(plugins)等裝備, 而添加spring-boot-starter-web這個依賴,則純粹是我們希望構建一個獨立運行的web應用而已(注意, 沒有version元素定義,因為spring-boot-starter-parent已經提供了相應的dependencyManagement)。有了以上配置,我們就可以按照SpringMVC的套路添加相應的Controller實現就可以了。
要讓Spring Boot可以獨立運行和部署,我們需要一個Main方法入口。
三、Spring Boot如何工作
3.1?Spring 特性回顧
3.1.1?XML配置與JavaConfig的選擇問題
SpringBoot倡導基于JavaConfig的形式來“裝配”應用, 但有些層面,我們還是希望根據公司的生態圈和基礎設施現狀,對其進行一些定制,以便更好的融入并享受一系列生態,而大部分要集成外部已有系統的時候, 通過xml集中明確化配置我認為是比較合適的做法。
總之, 這兩種方式不應該是東風壓倒西風,而應該根據情況來選擇。 從我的角度來講,我希望在SpringBoot里,除了Main入口類和autoscan相關的地方使用JavaConfig, 其它最好以xml配置。
3.1.2 @Configuration注解
@Configuration這個注解就是JavaConfig的典型代表。標注了這個注解的Java類定義,會以Java代碼的形式(對應于xml定義的形式)提供一系列的bean定義和實例。 結合AnnotationConfigApplicationContext和自動掃描的功能,就可以構建一個基于Spring容器的Java應用。
一系列標注了@Configuration的Java類的集合,對應于“昨日”的一系列xml配置文件。
3.1.3 @ComponentScan注解
@ComponentScan對應xml時代的<context:component-scan>。用來掃描classpath下標注了相應注解的Bean定義,然后加載到Spring容器中。
一般配合@Configuration注解來使用,你可以將@Configuraiton做的事情是純手工定義bean然后添加到Spring容器, 而@ComponentScan則是自動收集bean定義并添加到Spring容器。
3.1.4 @Import注解
Spring容器的配置可以分散在多個物理存在的配置類或者配置文件中。
@Import允許將其它JavaConfig形式的配置類引入到當前的@Configuration標注的配置類當中, 對應于原來xml時代的<import/>, 甚至于也可以通過@ImportResource將xml形式定義的配置也引入當前JavaConfig形式的配置類當中。
3.1.5 @PropertySource注解
配合@Configuration使用, 用來加載.properties內容到Environment,比如:@PropertySource("classpath:/application.properties"),并需要容器中配置一個PropertySourcesPlaceholderConfigurer。
@PropertySource和@PropertySources的區別在于, 后者屬于前者的Aggregation類型, 在有多個.properties資源需要引入的情況下,如果能夠使用Java8的repeatable annotation特性,則只需要聲明多個@PropertySource就行了, 否則,作為fallback方案,使用@PropertySources然后再其中引用多個@PropertySource好了。
3.1.6 Environment和Profile
這兩個概念應該是Spring3時代引入的, Environment用來統一表達當前應用程序運行環境的概念,會以Properties的形式提供一系列該環境下的上下文信息,而且允許當前應用程序獲取activeProfile是哪個。
說實話,Environment的設計,我覺得到提供上下文信息這一關鍵職能就可以了, 而Profile的設計,則有些太過于Monolithic時代的做事風格。 Profile一般用來提供某些靈活性, 但這種靈活性是內部化的, 這意味著, 你的軟件實體需要知道外面可能提供多少種profiles, 然后在不同的profile下,我的軟件實體需要做什么樣的調整。 而實際上, 軟件實體從研發到交付和使用, 最好是在整條流水線上設計和生產都是一致, 只有“銷售”之前,才根據目標環境或者目標客戶調整“包裝”和配置, 然后“發貨”, 用戶拿到手的產品(當然包括我們搞的軟件產品)應該是開箱即用的, 這個產品既不會存在我不需要的功能,也不應該每次使用的時候先自己“很智能”的掃描一下上下文環境然后決定使用哪一個Profile。尤其是在微服務時代,隨著你服務數量的增長, 服務數量 * Environment數量 * 所謂的Profile數量更是指數級增長 3, 如果應用開發的時候還要考慮這么多,那出問題的幾率就更大了。
所以, 在Microservices時代,我們更建議外部化你的軟件產品差異化配置管理, 盡量減少Profile的濫用甚至不用(這就減少一個緯度的管理)。
3.2 對@EnableAutoConfiguration的理解
在本文之前提到的所有Annotation都屬于SpringFramework提供的, 現在要說的這個Annotation,即@EnableAutoConfiguration, 則屬于SpringBoot。
@EnableAutoConfiguration的定義信息如下:
標注了這個Annotation的配置類將觸發一系列動作, 也是SpringBoot“黑魔法”的核心, 魔法大體上是這樣發生的: SpringBoot一旦發現@EnableAutoConfiguration, 那么就使用Spring框架提供的SpringFactoriesLoader這個特性去掃描當前應用classpath下所有META-INF/spring.factories元信息配置, 然后根據當前使用場景需要, 加載符合當前場景需要的配置類型并供當前或者后繼流程使用, 對于@EnableAutoConfiguration的場景,就是提取以org.springframework.boot.autoconfigure.EnableAutoConfiguration作為key標志的一系列Java配置類,然后將這些Java配置類中的bean定義加載或者說灌入Spring容器中。
當然, EnableAutoConfiguration通過SpringFactoriesLoader篩選并加載進來的這些Java配置類里面,我們其實還可以進一步對要加載到容器的bean定義進行篩選, 這就會用Spring3系列引入的@Conditional“軍團”, 通過像@ConditionalOnClass, @ConditionalOnMissingBean等具體的類型和條件來進一步決定加載還是不加載哪些bean定義。
3.3 Enter Main
有了上面的這些“前戲”, 下面我們正式進入正題了...
每一個SpringBoot應用都有一個入口類,在其中定義main方法, 然后使用SpringApplication這個類來加載指定配置并運行SpringBoot應用程序, 在很多SpringBoot的介紹中,都會使用當前入口類既作為配置(標注@Configuration)又作為入口類, 比如我們的HellSpringBoot:
@SpringBootApplication等效于@Configuraiton + @EnableAutoConfiguration + @ComponentScan, 所以, 當我們將HelloSpringBoot.class作為JavaConfig配置類傳入SpringApplication.run方法之后, SpringApplication.run方法就知道從哪里加載并掃描必要的bean定義了。
現在,剩下的就是要搞清楚SpringApplication.run里面發生了什么。
鳴謝
《Spring Boot Rock’n’Roll》
總結
以上是生活随笔為你收集整理的Spring Boot————简介与Spring时代的承接的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php 查找无限级,Ztree +
- 下一篇: java url后面带sessionid