本篇將介紹 Spring Boot 的簡單使用方式,會通過一個HelloWorldDemo來說明。
構建 Spring Boot 項目文件系統
這里推薦使用項目自動化構建工具,可以提高效率。本文使用的是Gradle,具體步驟可以參考《工具使用——如何使用Gradle創建一個Spring Boot項目》。
在這里有一點需要注意,即在Gradle引入項目依賴時,官方推薦的是忽略掉所依賴的jar包的版本號。這是因為Spring Boot 的 Gradle 插件會提供 Dependencies Management(依賴管理),依賴管理在沒有指明依賴的版本號時,自動更新所引用的依賴包,并使所有依賴的包之間也可以相互協作。但若是手動指定版本,可能會因為依賴包間的版本沖突,產生問題。
關于starters依賴描述符
在引入 Spring Boot 依賴時,會根據所要完成的應用的需求,引入許多如spring-boot-starter-*
形式命名的依賴。這些依賴統稱為 Spring Boot Starters。它們包含了完成一定功能的,應用所需要的依賴描述符。
為了便于項目構建,這些Starters都可以通過一站式商店直接獲取。這樣就可以不必同伙寫代碼、復制粘貼等步驟到處搜索。
下面列出了幾個基本的Web Application會用到的Starters:
| 名稱 | 作用 |
| : ------ : | : ------ : |
| spring-boot-starter-web
| 用于構建Web,包含了RESTful,使用Spring MVC作為基礎框架,并使用 Tomcat 作為默認的內嵌容器。 |
| spring-boot-starter-test
| 包含了 Spring Boot 應用測試所需要的依賴庫。如JUnit、Hamcret和Mockito。|
| spring-boot-starter-jdbc
| 用于Spring Boot 應用配置,告知使用 Tomcat JDBC 連接池。|
| spring-boot-starter-jpa
| 用于告知 Spring Boot 配置,通過Hibernate持久層框架使用 Spring Data JPA。|
| spring-boot-starter-hateoas
| 用于構建基于超媒體 RESTful 的 Web 應用,使用了Spring MVC 和Spring HATEOAS|
當然,還有很多其他的依賴可供使用,在需要時可以去“Maven central"查找。
構筑代碼
Spring Boot 并不強行要求開發者按照某種代碼結構去書寫才能正常運行,但是會有一些最佳實踐。
-
注意默認包(default package)的使用
當沒有聲明包名的情況下,當前類會被視為放在default package中,而這時,使用@ComponentScan
、@EnableAutoConfiguration
、@SpringBootApplication
等注解都可能會出現問題。因此,官方推薦在構筑代碼時,最好采用com.example.project
的形式將所有會用到的類都放入對應的命名包中。 -
注意包含 main 方法的 Application 類的位置
由于該類中會含有@ComponentScan
、@EnableAutoConfiguration
、@SpringBootApplication
等注解,其中@EnableAutoConfiguration
會對當前package下所有的package進行查找以便找到配置所需的明確條目。而@ComponentScan
會根據之前查找到的明確的條目,將這些組件注冊到Spring容器中。那么,將Application 類放置在項目的 root package 下的好處就顯而易見了,這樣做可以使@ComponentScan
在無需明確指定要掃描的package的條件下,就掃描到所有的組件,從而順利完成自動配置。最終達到簡化配置的目的。
Spring Boot 的配置類
Spring Boot 同樣支持 XML 配置和基于 Java 的配置。但是相比之下,更加推薦使用基于 Java 的配置。這種配置方式需要開發者在主要的配置類中添加一個main()
方法,并將其委托給 SpringApplication 類的run()
方法執行。基于 Java 的配置類需要通過@Configuration
注解標明,或者通過@Import
注解引入到主要的配置類中。如果一定要使用 XML 配置文件,可以通過 @ImportResource
注解將 XML 文件引入到主要配置類中。
Spring Boot 的自動配置
Spring Boot 的自動配置是根據當前添加的項目依賴(jar包)去自動完成相關配置的。例如添加了 spring-boot-starter-web
依賴包,Spring Boot 就會自動按照Web Application的默認形式去完成與 web.xml 基本工作等價的配置。當開發者想要應用自動配置功能時,就需要在標注了@Configuration
的配置類類中添加 @EnableAutoConfiguration
注解。
當然,完全依賴自動配置會限制 Web 應用的功能。因此,Spring Boot 推薦開發者根據需求逐步替換自動配置。能做到這一點,也是因為Spring Boot 提供的自動配置是非侵入性的,使得開發者可以從任意一點切入去更改默認配置而不影響項目其他部分。
另外,當開發者使用了多個配置類時,可以通過@EnableAutoConfiguration
提供的 exclude = SomeConfiguration.class
或 excludeName = someConfigurationInstance
屬性來指定不去應用某個配置類。
Spring Boot Beans 和 Denpendency Injection
Spring Boot 支持Spring framework 技術中的 Beans 定義和依賴注入方式。因此,開發者可以很容易的使用 @ComponentScan
找尋 Beans ,并利用 @Autowired
注解完成依賴注入。
@ComponentScan
可以講所有的應用組件都注冊到Spring容器中。
應用組件(Beans)的標注可以通過@Comtroller
、@Service
、@Repository
、@Component
完成。
以下是以Controller為例的代碼:
import com.tw.jlhe.helloworld.model.Greeting;
import com.tw.jlhe.helloworld.service.HelloWorldService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloWorldController {
@Autowired
HelloWorldService helloWorldService;
@RequestMapping(value = "/greeting" , method = RequestMethod.GET)
public ResponseEntity<?> greeting(){
Greeting greeting = new Greeting();
greeting.setGreetingContent(helloWorldService.greering());
return ResponseEntity.ok(greeting);
}
@RequestMapping(value = "/{name}" , method = RequestMethod.GET )
public ResponseEntity<?> greetingToSomeone(@PathVariable String name){
Greeting greeting = new Greeting();
greeting.setGreetingContent(helloWorldService.greetingToSomeone(name));
return ResponseEntity.ok(greeting);
}
@RequestMapping(value = "/greeting/{id}" , method = RequestMethod.GET)
public ResponseEntity<?> greetingToRepository(@PathVariable Long id){
Greeting greeting = new Greeting();
greeting.setGreetingContent(helloWorldService.greetingToRepository(id));
return ResponseEntity.ok(greeting);
}
}
其中 @RestController
注解表明當前類是一個 Controller 組件,會被注冊到Spring容器中。當有請求訪問時,Spring容器會自動創建一個該組件的實例來處理請求。在創建該實例的過程中,容器會獲取到 @Autowired
注解,并被告知此處需要注入一個HelloWorldService的實例,也就是該Controller的依賴。那么Spring容器就會根據Java類名反射機制,在 @Service
注解標注的組件中找到一個合適的Service類去創建實例,并將該實例注入到該處。這個創建實例和注入依賴的過程是一種遞歸的過程。
關于@SpringBootApplication注解
這里需要提一下,@SpringBootApplication
注解是Spring Boot 的注解,本著為開發應用提供便捷途徑的原則,Spring Boot將基于 Java 配置類中最佳實踐常用的三個注解@ComponentScan
、@EnableAutoConfiguration
、@Configuration
的功能合并成了@SpringBootApplication
。
了解了以上知識點,就可以使用 Spring Boot 完成一個簡單的 HelloWorldDemo了。
參考資料
http://docs.spring.io/spring-boot/docs/1.4.3.RELEASE/reference/htmlsingle/#getting-started