Spring-Boot:6分鐘掌握SpringBoot開發

 構建項目

從技術角度來看,咱們要用Spring MVC來處理Web請求,用Thymeleaf來定義Web視圖,用Spring Data JPA來把閱讀列表持久化到數據庫裏,姑且先用嵌入式的H2數據庫。

html

一、項目搭建

Spring IO 官網搭建

咱們能夠進入到Spring 的官網:http://start.spring.io/
進入官網後,能夠快速的構建Spring boot 的基礎項目,這裏能夠選擇Maven 項目或者Gradle 項目,而後設置項目相關的配置。java

在選擇Generate Project 進行項目下載後,會生成對應的zip 文件。後續只須要將Zip 文件解壓,添加到IDE 中便可。
git

 


 IDEA 快速構建

除了在SpringIO 官網進行項目初始化外,還能夠經過IDEA 進行項目的搭建。以下圖所示,項目的搭建也是引用了 http://start.spring.io/ github

在後續的頁面中,咱們能夠設置相關的配置信息,一些經常使用的依賴,也能夠進行初始化。web

 


 

 


 Spring Boot CLI

除了以上經常使用的項目建立方法之外,咱們還能夠經過CLI 進行項目的建立:spring

spring init -dweb,data-jpa,h2,thymeleaf --build gradle readinglist

  

CLI的init命令是不能指定項目根包名和項目名的。包名默認是demo,項目名默認是Demo。sql

 

 二、目錄結構

無論咱們採用哪一種方式進行項目的建立,在將項目導入IDE以後,咱們能夠看到整個項目結構遵循傳統Maven或Gradle項目的佈局,即主要應用程序代碼位於src/main/java目錄裏,資源都在src/main/resources目錄裏,測試代碼則在src/test/java目錄裏。此刻尚未測試資源,但若是有的話,要放在src/test/resources裏。數據庫

 

文件介紹:

  •  SpringBootWebApplication: 應用程序的啓動引導類(bootstrap class),也是主要的Spring 配置類。
  • appliction.properties:用於配置應用程序和Spring boot 的屬性
  •  SpringBootWebApplicationTests:一個基本的集成測試類。
  •  pom.xml:項目依賴文件


三、文件介紹

 

 SpringBootWebApplication


Application 類在Spring boot應用程序中有兩個做用:配置和啓動引導。


express

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication --開啓組件掃描和自動配置
public class SpringBootWebApplication {

public static void main(String[] args) {
SpringApplication.run(SpringBootWebApplication.class, args); -- 負責啓動引導應用程序
}
}

 


咱們在使用Spring boot 進行開發時,Application 類是咱們啓動服務的入口,起到關鍵做用的是 **@SpringBootApplication** 這一註解,實際上 @SpringBootApplication 包含了三個有用的註解:apache

  • @Configuration:標明該類使用Spring 基於Java 的配置。
  • @ComponentScan:啓用組件掃描,這樣你寫的Web控制器類和其餘組件才能被自動發現並註冊爲Spring 應用程序上下文中的Bean。
  • @EnableAutoConfiguration:這一個配置開啓了Spring boot 的自動配置。

這裏使用到main 方法是須要提供一個@EnableAutoConfiguration 註解的引導類,來引導整個應用程序的啓動。


SpringBootWebApplicationTests


項目建立時問咱們建立了一個帶有上下文的測試類。

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

@RunWith(SpringRunner.class)
@SpringBootTest -- 經過SpringBoot 加載上下文
public class SpringBootWebApplicationTests {

@Test
public void contextLoads() {
-- 測試加載的上下文
}

}

 

 application.properties

實際上,這個文件是可選的,你能夠刪掉它而不影響應用程序的運行。
咱們能夠經過向application.properties 中添加變量,從而改變程序的默認配置。例如:

server.port=8000
server.contextPath=SpringBootWeb

 

在上述代碼中,咱們將程序的默認端口(8080) 修改爲爲使用 8000 端口,而且將應用程序的項目名修改成 SpringBootWeb。

原訪問地址:

http://127.0.0.1:8080/

修改後:

http://127.0.0.1:8000/SpringBootWeb/


除此以外 還能夠配置多環境的變量設置等一系列的設置:

 

spring.profiles.active = dev

 

 

pom.xml


在代碼清單中,咱們引用了 spring-boot-starter-parent 做爲上一級,這樣一來就能利用到Maven 的依賴管理功能,集成不少經常使用庫的依賴,而且不須要知道版本。除此以外,也使用到了開篇所提到過的起步依賴,咱們只須要引入 spring-boot-starter-web 這一依賴,就可使用到Web 中經常使用的包。

<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.7.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>


<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
...
</dependencies>

 


以下圖所示,咱們使用到的 spring-boot-starter-web 依賴中,已經集成了經常使用的mvc json 等相關依賴。

org.springframework.boot:spring-boot-starter-web:jar:1.5.7.RELEASE:compile
[INFO] | +- org.springframework.boot:spring-boot-starter-tomcat:jar:1.5.7.RELEASE:compile
[INFO] | | +- org.apache.tomcat.embed:tomcat-embed-core:jar:8.5.20:compile
[INFO] | | +- org.apache.tomcat.embed:tomcat-embed-el:jar:8.5.20:compile
[INFO] | | \- org.apache.tomcat.embed:tomcat-embed-websocket:jar:8.5.20:compile
[INFO] | +- org.hibernate:hibernate-validator:jar:5.3.5.Final:compile
[INFO] | | +- javax.validation:validation-api:jar:1.1.0.Final:compile
[INFO] | | \- com.fasterxml:classmate:jar:1.3.4:compile
[INFO] | +- com.fasterxml.jackson.core:jackson-databind:jar:2.8.10:compile
[INFO] | | +- com.fasterxml.jackson.core:jackson-annotations:jar:2.8.0:compile
[INFO] | | \- com.fasterxml.jackson.core:jackson-core:jar:2.8.10:compile
[INFO] | +- org.springframework:spring-web:jar:4.3.11.RELEASE:compile
[INFO] | \- org.springframework:spring-webmvc:jar:4.3.11.RELEASE:compile
[INFO] | \- org.springframework:spring-expression:jar:4.3.11.RELEASE:compile

 

 


 四、開發功能


 4.1 定義實體類 Book

 

如你所見,Book類就是簡單的Java對象,其中有些描述書的屬性,還有必要的訪問方法。
@Entity註解代表它是一個JPA實體,id屬性加了@Id和@GeneratedValue註解,說明這個字段
是實體的惟一標識,而且這個字段的值是自動生成的。

import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

/**
* Created by weijie_huang on 2017/9/20.
*/

@Entity
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class Book {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String reader;
private String isbn;
private String title;
private String author;
private String description;
}

 

 4.2 定義倉庫接口 ReadRepository

經過擴展JpaRepository,ReadingListRepository直接繼承了18個執行經常使用持久化操做
的方法。JpaRepository是個泛型接口,有兩個參數:倉庫操做的領域對象類型,及其ID屬性的
類型。此外,我還增長了一個findByReader()方法,能夠根據讀者的用戶名來查找閱讀列表。

import com.jaycekon.demo.domain.Book;
import org.springframework.data.jpa.repository.JpaRepository;

import java.util.List;

/**
* Created by weijie_huang on 2017/9/20.
*/
public interface ReadRepository extends JpaRepository<Book,Long> {
List<Book> findByReader(String reader);
}

 

 4.3 定義控制層 ReadController

在定義好了應用程序的實體類,持久化接口後。咱們還須要建立一個MVC 控制器來處理HTTP請求。

import com.jaycekon.demo.dao.ReadRepository;
import com.jaycekon.demo.domain.Book;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import java.util.List;

/**
* Created by weijie_huang on 2017/9/20.
*/
@Controller
public class ReadController {
@Autowired
private ReadRepository readRepository;


@RequestMapping(value="/{reader}", method= RequestMethod.GET)
public String readersBooks(
@PathVariable("reader") String reader,
Model model) {
List<Book> readingList =
readRepository.findByReader(reader);
if (readingList != null) {
model.addAttribute("books", readingList);
}
return "readingList";
}

@RequestMapping(value="/{reader}", method=RequestMethod.POST)
public String addToReadingList(
@PathVariable("reader") String reader, Book book) {
book.setReader(reader);
readRepository.save(book);
return "redirect:/{reader}";
}

}

 


使用了@Controller註解,這樣組件掃描會自動將其註冊爲
Spring應用程序上下文裏的一個Bean。經過@Autowired 將倉庫接口注入到控制類中。


 4.4 啓動服務

在開發完成後,咱們去到Application 類下,啓動main 方法。便可將應用程序啓動,而後進入到下述頁面(html 文件不細述,可經過查看源碼進行了解)。能夠看到,咱們的服務已經成功啓動。

 

 

 

 

 4.5 流程分析


你們可能會很疑惑,爲何咱們沒有配置數據庫信息,卻沒有報異常。咱們明明建立了 ReadRepository 數據庫接口,若是沒有DataSource 的話,應該是會報異常的。可是Spring boot 卻巧妙的避開了這種問題。

首先咱們須要來了解一下Spring-boot-autoconfigure 這個依賴包。這個Jar包下包含了不少的配置類。例如Thymeleaf,JPA以及Mvc的相關配置。

這裏主要涉及到了Condition 接口,該接口的做用是,只有到某個條件達成後,纔回對這個Bean 進行實例化。

註解:

  • @ConditionalOnBean  配置了某個特定Bean
  • @ConditionalOnMissingBean 沒有配置特定的Bean
  • @ConditionalOnClass Classpath裏有指定的類
  • @ConditionalOnMissingClass Classpath裏缺乏指定的類
  • @ConditionalOnExpression 給定的Spring Expression Language(SpEL)表達式計算結果爲true
  • @ConditionalOnJava Java的版本匹配特定值或者一個範圍值
  • @ConditionalOnJndi 參數中給定的JNDI位置必須存在一個,若是沒有給參數,則要有JNDI
  • @ConditionalOnProperty 指定的配置屬性要有一個明確的值
  • @ConditionalOnResource Classpath裏有指定的資源

上述程序之全部沒有進行數據庫操做,主要能夠參考 DataSourceAutoConfiguratio 這個類的相應配置。

 

@Configuration
@ConditionalOnClass({DataSource.class, EmbeddedDatabaseType.class})
@EnableConfigurationProperties({DataSourceProperties.class})
@Import({Registrar.class, DataSourcePoolMetadataProvidersConfiguration.class})
public class DataSourceAutoConfiguration 

 

能夠看到,只有DataSource 這個類實例化以後,這個Bean纔會進行實例化。咱們再往下觀察能夠看到 JdbcTemplateConfiguratio 也有想相似的狀況。

此處看到的只是DataSourceAutoConfiguration的冰山一角,Spring Boot提供的其餘自
動配置類也有不少知識沒有提到。但這已經足以說明SpringBoot如何利用條件化配置實現自動配置。

自動配置會作出如下配置決策,它們和以前的例子息息相關。

 

- 由於Classpath 裏有H2 , 因此會建立一個嵌入式的H2 數據庫Bean , 它的類型是
javax.sql.DataSource,JPA實現(Hibernate)須要它來訪問數據庫。

- 由於Classpath裏有Hibernate(Spring Data JPA傳遞引入的)的實體管理器,因此自動配置
會配置與Hibernate 相關的Bean , 包括Spring 的LocalContainerEntityManager-
FactoryBean和JpaVendorAdapter。

- 由於Classpath裏有Spring Data JPA,因此它會自動配置爲根據倉庫的接口建立倉庫實現。

- 由於Classpath裏有Thymeleaf,因此Thymeleaf會配置爲Spring MVC的視圖,包括一個
Thymeleaf的模板解析器、模板引擎及視圖解析器。視圖解析器會解析相對於Classpath根
目錄的/templates目錄裏的模板。

- 由於Classpath 裏有Spring MVC ( 歸功於Web 起步依賴), 因此會配置Spring 的
DispatcherServlet並啓用Spring MVC。

- 由於這是一個Spring MVC Web應用程序,因此會註冊一個資源處理器,把相對於Classpath
根目錄的/static目錄裏的靜態內容提供出來。(這個資源處理器還能處理/public、/resources
和/META-INF/resources的靜態內容。)

- 由於Classpath裏有Tomcat(經過Web起步依賴傳遞引用),因此會啓動一個嵌入式的Tomcat
容器,監聽8080端口。

 總結

經過Spring Boot的起步依賴和自動配置,你能夠更加快速、便捷地開發Spring應用程序。起步依賴幫助你專一於應用程序須要的功能類型,而非提供該功能的具體庫和版本。與此同時,自動配置把你從樣板式的配置中解放了出來。這些配置在沒有Spring Boot的Spring應用程序裏很是常見。

雖然自動配置很方便,但在開發Spring應用程序時其中的一些用法也有點武斷。要是你在配置Spring時但願或者須要有所不一樣,該怎麼辦?在第3章,咱們將會看到如何覆蓋Spring Boot自動配置,藉此達成應用程序的一些目標,還有如何運用相似的技術來配置本身的應用程序組件。

 

 

github 地址:https://github.com/jaycekon/SpringBoot

相關文章
相關標籤/搜索