什麼是Spring Boot Starters?

banq發表於2018-08-22
Spring Boot Starter顧名思義是為不同目的啟動Spring Boot應用程式。比如:
spring-boot-starter-parent:它是一個特殊的啟動器,提供有用的Maven預設值。它在POM的父節中使用。
spring-boot-starter-web:使用MVC構建Web和RESTful應用程式的入門者。
spring-boot-starter-security:使用Spring Security的入門者。
spring-boot-starter-web-services:使用Spring Web服務的初學者。
spring-boot-starter-thymeleaf:使用Thymeleaf檢視的Spring MVC的初學者。
spring-boot-starter-freemarker:使用FreeMarker檢視啟動Spring MVC。
spring-boot-starter-test:單元測試和整合測試,預設引用。
spring-boot-starter-jdbc: 傳統 JDBC
spring-boot-starter-hateoas: 增加 HATEOAS 特性到服務。
spring-boot-starter-security: 使用spring安全實現驗證和授權。
spring-boot-starter-data-jpa: Spring Data JPA Hibernate支援
spring-boot-starter-cache: 啟用 Spring Framework的快取支援

這些啟動器需要配置在maven的pom.xml中,執行時這些包jar在classpath類路徑中就會被載入。下面是標準的pom.xml:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>com.concretepage</groupId>
	<artifactId>spring-boot-app</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<packaging>jar</packaging>
	<name>spring-boot-app</name>
	<description>Spring Boot Application</description>
	<parent>
	    <groupId>org.springframework.boot</groupId>
  	    <artifactId>spring-boot-starter-parent</artifactId>
	    <version>2.0.4.RELEASE</version>
 	    <relativePath/>
	</parent>
	<properties>
	    <java.version>9</java.version>
	</properties>
	<dependencies>
          <dependency>
	    <groupId>org.springframework.boot</groupId>
	    <artifactId>spring-boot-starter-web</artifactId>
          </dependency>
	  <dependency>
	    <groupId>org.springframework.boot</groupId>
	    <artifactId>spring-boot-devtools</artifactId>
	    <optional>true</optional>
	  </dependency> 
	</dependencies>
	<build>
	  <plugins>
	     <plugin>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-maven-plugin</artifactId>
	     </plugin>
	  </plugins>
	</build>
</project> 
<p class="indent">

可以透過https://start.spring.io選擇元件方式,或透過Idea等開發工具Spring導航選擇元件,就會自動生成這個pom.xml檔案。

下面介紹幾個常用的Starter:

Web
以前開發REST服務可能需要手工在pom.xml加入像Spring MVC,Tomcat和Jackson這些庫的依賴項,Spring Boot啟動器只要新增一個依賴項就可以了:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<p class="indent">

現在我們可以建立一個REST控制器:

@RestController
public class GenericEntityController {
    private List<GenericEntity> entityList = new ArrayList<>();
 
    @RequestMapping("/entity/all")
    public List<GenericEntity> findAll() {
        return entityList;
    }
 
    @RequestMapping(value = "/entity", method = RequestMethod.POST)
    public GenericEntity addEntity(GenericEntity entity) {
        entityList.add(entity);
        return entity;
    }
 
    @RequestMapping("/entity/findby/{id}")
    public GenericEntity findById(@PathVariable Long id) {
        return entityList.stream().
                 filter(entity -> entity.getId().equals(id)).
                   findFirst().get();
    }
}
<p class="indent">

GenericEntity是一個簡單的bean,有一個ID型別的欄位和字串。
啟動這個應用程式執行時,訪問http:// localhost:8080/entity/all

測試
為了測試,我們通常使用以下一組庫:Spring Test,JUnit,Hamcrest和Mockito。我們可以手動包含所有這些庫,但可以使用Spring Boot starter以下列方式自動包含這些庫:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
</dependency>
<p class="indent">

無需指定版本號。Spring Boot將自己確定要使用的版本 - 你需要指定的是spring-boot-starter-parent版本即可的版本。如果以後需要升級Boot庫和依賴項,只需在一個地方升級Boot版本,Spring Boot將負責其餘的工作。

有兩種方法可以測試REST控制器:
1.使用模擬環境
2.使用嵌入式Servlet容器(如Tomcat或Jetty)
下面使用使用模擬環境:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = Application.class)
@WebAppConfiguration
public class SpringBootApplicationIntegrationTest {
    @Autowired
    private WebApplicationContext webApplicationContext;
    private MockMvc mockMvc;
 
    @Before
    public void setupMockMvc() {
        mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build();
    }
 
    @Test
    public void givenRequestHasBeenMade_whenMeetsAllOfGivenConditions_thenCorrect()
      throws Exception { 
        MediaType contentType = new MediaType(MediaType.APPLICATION_JSON.getType(),
        MediaType.APPLICATION_JSON.getSubtype(), Charset.forName("utf8"));
        mockMvc.perform(MockMvcRequestBuilders.get("/entity/all")).
        andExpect(MockMvcResultMatchers.status().isOk()).
        andExpect(MockMvcResultMatchers.content().contentType(contentType)).
        andExpect(jsonPath("$", hasSize(4))); 
    } 
}
<p class="indent">

重要的是:@WebAppConfiguration註釋和MockMVC是spring-test模組的一部分,hasSize是一個Hamcrest匹配器,而@Before是一個JUnit註釋。這些都可以透過匯入這一個啟動器依賴項來獲得。

JPA
大多數Web應用程式都具有某種資料庫訪問 - 通常是JPA:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
    <scope>runtime</scope>
</dependency>
<p class="indent">

請注意,Springboot開箱即用特性可以至少自動支援以下資料庫:H2,Derby和Hsqldb。在我們的例子中,我們將使用H2。

為我們的實體建立儲存庫:

public interface GenericEntityRepository extends JpaRepository<GenericEntity, Long> {}
<p class="indent">

這裡沒有指定資料庫供應商,URL連線和使用者名稱密碼。這些不需要額外的配置,因為我們從可靠的Boot預設值中受益; 但當然,如使用MySQL Oracle等資料庫需要在application.propertie或yaml中配置所有這些細節。這些配置都是外部化的。

相關文章