[原]Spring Boot(1)-快速構建應用

totl 8年前發布 | 54K 次閱讀 Spring JEE框架 Spring Boot

 

Spring 框架作為目前非常流行的一個 Java 應用開發框架,它所包含的內容是非常繁多的。Spring 框架包含幾十個不同的子項目,涵蓋應用開發的不同方面。要在這些子項目之間進行選擇,并快速搭建一個可以運行的應用是比較困難的事情。Spring Boot 的目的在于快速創建可以獨立運行的 Spring 應用。通過 Spring Boot 可以根據相應的模板快速創建應用并運行。Spring Boot 可以自動配置 Spring 的各種組件,并不依賴代碼生成和 XML 配置文件。Spring Boot 可以大大提升使用 Spring 框架時的開發效率。

官方文檔: http://docs.spring.io/spring-boot/docs/current/reference/html/

Spring Boot提供了一個強大的一鍵式Spring的集成開發環境,能夠單獨進行一個Spring應用的開發,其中:
(1)集中式配置(application.properties)+注解,大大簡化了開發流程
(2)內嵌的Tomcat和Jetty容器,可直接打成jar包啟動,無需提供Java war包以及繁瑣的Web配置
(3)提供了Spring各個插件的基于Maven的pom模板配置,開箱即用,便利無比。
(4)可以在任何你想自動化配置的地方,實現可能
(5)提供更多的企業級開發特性,如何系統監控,健康診斷,權限控制
(6) 無冗余代碼生成和XML強制配置
(7)提供支持強大的Restfult風格的編碼,非常簡潔

1、安裝

  • 一個稱手的文本編輯器(例如Vim、Emacs、Sublime Text)或者IDE(Eclipse、Idea Intellij)
  • Java環境(JDK 1.7或以上版本)
  • Maven 3.0+(Eclipse和Idea IntelliJ內置,如果使用IDE并且不使用命令行工具可以不安裝)

1. spring-boot是一個mavan項目,所以其使用的jar包全部是通過maven管理,當然,使用maven也是非常方便的。

2. spring-boot打出來的包是一個可執行jar包的狀態,使用的是內置的tomcat服務器,所以不需要將項目轉成EJB項目。

Eclipse插件安裝

1) 插件安裝

點擊菜單 Help -> Install new software 進行插件安裝

插件地址 http://m2eclipse.sonatype.org/sites/m2e

如果你已經成功安裝了這個插件,當你打開Window→ Preferences...的時候,你應該能夠在一個選項列表中看到一個Maven選項

安裝好m2eclipse插件后,要作兩個設置 a) 禁用Downloadrepository index updates on startup(即取消這個選項的勾選,第三個第四個可以點上),如下圖

b) 設置maven的setting.xml文件路徑,如下圖

2、創建應用

使用Spring Boot框架可以大大加速Web應用的開發過程,首先在Maven項目依賴中引入 spring-boot-starter-web :

我們在 Eclipse  創建maven項目:

填寫GroupId和artifactId

后生成:

import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @SpringBootApplication @RestController public class Application { @RequestMapping("/") public String greeting() { return "Hello World!"; } public static void main(String[] args) { SpringApplication.run(Application.class, args); } }

在IDE中直接直接執行main方法,然后訪問http://localhost:8080即可。

另外可以使用maven打包為可執行jar包,然后執行java -jar xxx.jar。

或者執行mvn spring-boot:run運行項目。

在瀏覽器中訪問http://localhost:8080/,Hello World!就出現在了頁面中。只用了區區十幾行Java代碼,一個Hello World應用就可以正確運行.

3、spring boot項目結構

3.1、 pom.xml文件

 pom.xml文件就是項目依賴文件,maven根據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>guisu</groupId> <artifactId>guisu-demo</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>guisu</name> <description>Demo project for Spring WebMvc</description> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.2.5.RELEASE</version> <relativePath/> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>

在Maven依賴中引入了 spring-boot-starter-web ,它包含了Spring Boot預定義的一些Web開發的常用依賴:

  • spring-web ,  spring-webmvc  Spring WebMvc框架
  • tomcat-embed-*  內嵌Tomcat容器
  • jackson  處理json數據
  • spring-*  Spring框架
  • spring-boot-autoconfigure  Spring Boot提供的自動配置功能

“org.springframework.boot:spring-boot-starter-web”是 Spring Boot 所提供的推薦的基礎 POM 文件之一,用來提供創建基于 Spring MVC 的 Web 應用所需的第三方庫依賴。除了這個 POM 文件之外,Spring Boot 還提供了其他類似的 POM 文件。所有這些基礎 POM 依賴都在“org.springframework.boot”組中。一些重要 POM 文件的具體說明見:

Spring Boot 推薦的基礎 POM 文件

名稱 說明
spring-boot-starter 核心 POM,包含自動配置支持、日志庫和對 YAML 配置文件的支持。
spring-boot-starter-amqp 通過 spring-rabbit 支持 AMQP。
spring-boot-starter-aop 包含 spring-aop 和 AspectJ 來支持面向切面編程(AOP)。
spring-boot-starter-batch 支持 Spring Batch,包含 HSQLDB。
spring-boot-starter-data-jpa 包含 spring-data-jpa、spring-orm 和 Hibernate 來支持 JPA。
spring-boot-starter-data-mongodb 包含 spring-data-mongodb 來支持 MongoDB。
spring-boot-starter-data-rest 通過 spring-data-rest-webmvc 支持以 REST 方式暴露 Spring Data 倉庫。
spring-boot-starter-jdbc 支持使用 JDBC 訪問數據庫。
spring-boot-starter-security 包含 spring-security。
spring-boot-starter-test 包含常用的測試所需的依賴,如 JUnit、Hamcrest、Mockito 和 spring-test 等。
spring-boot-starter-velocity 支持使用 Velocity 作為模板引擎。
spring-boot-starter-web 支持 Web 應用開發,包含 Tomcat 和 spring-mvc。
spring-boot-starter-websocket 支持使用 Tomcat 開發 WebSocket 應用。
spring-boot-starter-ws 支持 Spring Web Services。
spring-boot-starter-actuator 添加適用于生產環境的功能,如性能指標和監測等功能。
spring-boot-starter-remote-shell 添加遠程 SSH 支持。
spring-boot-starter-jetty 使用 Jetty 而不是默認的 Tomcat 作為應用服務器。
spring-boot-starter-log4j 添加 Log4j 的支持。
spring-boot-starter-logging 使用 Spring Boot 默認的日志框架 Logback。
spring-boot-starter-tomcat 使用 Spring Boot 默認的 Tomcat 作為應用服務器。

所有這些 POM 依賴的好處在于為開發 Spring 應用提供了一個良好的基礎。Spring Boot 所選擇的第三方庫是經過考慮的,是比較適合產品開發的選擇。但是 Spring Boot 也提供了不同的選項,比如日志框架可以用 Logback 或 Log4j,應用服務器可以用 Tomcat 或 Jetty。

3.2  java代碼

創建 src/main/java/Application.java :

import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @SpringBootApplication @RestController public class Application { @RequestMapping("/") public String greeting() { return "Hello World!"; } public static void main(String[] args) { SpringApplication.run(Application.class, args); } }

類似如下結構:

com
 +- example
     +- myproject
         +- Application.java
         |
         +- domain //<span style="color: rgb(51, 51, 51); font-family: Helvetica, Tahoma, Arial, sans-serif; font-size: 14px; line-height: 24px; background-color: rgb(245, 245, 245);">用來管理javaBean實體對象</span>
         |   +- Customer.java
         |   +- CustomerRepository.java
         |
         +- service //業務邏輯層,處理數據邏輯,驗證數據

     |   +- CustomerService.java
     |
     +- web //Controller控制器
         +- CustomerController.java</code></pre> 

Spring Boot建議將我們 main 方法所在的這個 主要的配置類 配置在根包名下。

運行應用后,那么這段代碼究竟做了什么呢?我們從程序的入口 SpringApplication.run(Application.class, args); 開始分析:

Java代碼中沒有任何配置,和傳統的Spring應用相比,多了兩個我們不認識的符號:

  • @EnableAutoConfiguration
  • SpringApplication

它們都是由Spring Boot框架提供。在 SpringApplication.run() 方法執行后,Spring Boot的 autoconfigure 發現這是一個Web應用(根據類路徑上的依賴確定),于是在內嵌的Tomcat容器中啟動了一個Spring的應用上下文,并且監聽默認的tcp端口8080(默認約定)。同時在Spring Context中根據默認的約定配置了Spring WebMvc:

  • Servlet容器默認的Context路徑是 /
  • DispatherServlet 匹配的路徑( servlet-mapping 中的 url-patterns )是 /*
  • @ComponentScan 路徑被默認設置為 SampleController 的同名package,也就是該package下的所有 @Controller , @Service ,  @Component ,  @Repository 都會被實例化后并加入Spring Context中。

沒有一行配置代碼、也沒有 web.xml 。基于Spring Boot的應用在大多數情況下都不需要我們去顯式地聲明各類配置,而是將最常用的默認配置作為約定,在不聲明的情況下也能適應大多數的開發場景。

  1. SpringApplication 是Spring Boot框架中描述Spring應用的類,它的 run() 方法會創建一個Spring應用上下文(Application Context)。另一方面它會掃描當前應用類路徑上的依賴,例如本例中發現 spring-webmvc (由  spring-boot-starter-web 傳遞引入)在類路徑中,那么Spring Boot會判斷這是一個Web應用,并啟動一個內嵌的Servlet容器(默認是Tomcat)用于處理HTTP請求。

  2. Spring WebMvc框架會將Servlet容器里收到的HTTP請求根據路徑分發給對應的 @Controller 類進行處理, @RestController 是一類特殊的 @Controller ,它的返回值直接作為HTTP Response的Body部分返回給瀏覽器。 @RestController注解是@Controller和@ResponseBody的合集,表 示這是個控制器bean,并且是將函數的返回值直接填入HTTP響應體中,是REST風格的控制器。@RequestMapping("/books")表示該控制器處理所有“/books”的URL請求,具體由那個函數處理,要根據HTTP的方法來區分:GET表示查詢、POST表示提交、PUT表示更新、DELETE表示刪除。

  3. @RequestMapping 注解表明該方法處理那些URL對應的HTTP請求,也就是我們常說的URL路由(routing),請求的分發工作是有Spring完成的。例如上面的代碼中 http://localhost:8080/ 根路徑就被路由至 greeting() 方法進行處理。如果訪問 http://localhost:8080/hello ,則會出現 404 Not Found 錯誤,因為我們并沒有編寫任何方法來處理 /hello 請求。

4. 啟動項目SpringApplication.run

啟動Spring Boot項目最簡單的方法就是執行下面的方法:

SpringApplication.run(Application.class, args);

該方法返回一個ApplicationContext對象,使用注解的時候返回的具體類型是AnnotationConfigApplicationContext或AnnotationConfigEmbeddedWebApplicationContext,當支持web的時候是第二個。

除了上面這種方法外,還可以用下面的方法:

SpringApplication application = new SpringApplication(Application.class);
application.run(args);

SpringApplication 包含了一些其他可以配置的方法,如果你想做一些配置,可以用這種方式。

除了上面這種直接的方法外,還可以使用 SpringApplicationBuilder :

new SpringApplicationBuilder()
        .showBanner(false)
        .sources(Application.class)
        .run(args);

當使用SpringMVC的時候由于需要使用子容器,就需要用到 SpringApplicationBuilder ,該類有一個 child(xxx...) 方法可以添加子容器。

3.3  java代碼主要注解

因為默認和包有關的注解,默認包名都是當前類所在的包,例如 @ComponentScan, @EntityScan, @SpringBootApplication 注解。

@ RestController

因為我們例子是寫一個web應用,因此寫的這個注解,這個注解相當于同時添加 @Controller 和 @ResponseBody 注解。

@EnableAutoConfiguration

Spring Boot建議只有一個帶有該注解的類。

   @EnableAutoConfiguration 作用:Spring Boot會自動根據你jar包的依賴來自動配置項目。例如當你項目下面有 HSQLDB 的依賴時,Spring Boot會創建默認的內存數據庫的數據源 DataSource ,如果你自己創建了 DataSource ,Spring Boot就不會創建默認的 DataSource 。

如果你不想讓Spring Boot自動創建,你可以配置注解的 exclude 屬性,例如:

@Configuration
@EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class})
public class MyConfiguration {
}

@SpringBootApplication

由于大量項目都會在主要的配置類上添加 @Configuration,@EnableAutoConfiguration,@ComponentScan 三個注解。

因此Spring Boot提供了 @SpringBootApplication 注解,該注解可以替代上面三個注解(使用Spring注解繼承實現)。

@RequestMapping

注解表明該方法處理那些URL對應的HTTP請求,也就是我們常說的URL路由(routing),請求的分發工作是有Spring完成的。例如上面的代碼中 http://localhost:8080/ 根路徑就被路由至 greeting() 方法進行處理。如果訪問 http://localhost:8080/hello ,則會出現 404 Not Found 錯誤,因為我們并沒有編寫任何方法來處理 /hello 請求。

3.4  項目配置

Spring Boot最大的特色是“約定優先配置”,大量的默認配置對開發者十分的友好。但是在實際的應用開發過程中,默認配置不可能滿足所有場景,同時用戶也需要配置一些必須的配置項——例如數據庫連接信息。Spring Boot的配置系統能夠讓開發者快速的覆蓋默認約定,同時支持Properties配置文件和YAML配置文件兩種格式,默認情況下Spring Boot加載類路徑上的 application.properties 或 application.yml 文件,例如:

spring.datasource.url=jdbc:mysql://localhost/test
spring.datasource.username=dbuser
spring.datasource.password=dbpass
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

YAML格式更加簡潔:

spring:
 datasource:
 url: jdbc:mysql://localhost/test
 username: dbuser
 password: dbpass
 driver-class: com.mysql.jdbc.Driver

一旦發現這些信息,Spring Boot就會根據它們創建 DataSource 對象。另一個常見的配置場景是Web應用服務器:

# Server settings (ServerProperties)
server:
 port: 8080
 address: 127.0.0.1
 sessionTimeout: 30
 contextPath: /

 # Tomcat specifics
 tomcat:
 accessLogEnabled: false
 protocolHeader: x-forwarded-proto
 remoteIpHeader: x-forwarded-for
 basedir:
 backgroundProcessorDelay: 30 # secs

通過 port 和 address 可以修改服務器監聽的地址和端口, sessionTimeout 配置session過期時間(再也不用修改 web.xml 了,因為它根本不存在)。同時如果在生產環境中使用內嵌Tomcat,當然希望能夠配置它的日志、線程池等信息,這些現在都可以通過Spring Boot的屬性文件配置,而不再需要再對生產環境中的Tomcat實例進行單獨的配置管理了。

4、Sping boot處理請求

4.1 URL路由

現代Web應用往往包括很多頁面,不同的頁面也對應著不同的URL。對于不同的URL,通常需要不同的方法進行處理并返回不同的內容。

使用@Controller實現URL路由使用@Controller實現URL路由

匹配多個URL

@RestController
public class Application { @RequestMapping("/") public String index() { return "Index Page"; } @RequestMapping("/hello") public String hello() { return "Hello World!"; } }

@RequestMapping 可以注解 @Controller 類:

@RestController
@RequestMapping("/classPath")
public class Application { @RequestMapping("/methodPath") public String method() { return "mapping url is /classPath/methodPath"; } }

method 方法匹配的URL是 /classPath/methodPath" 。

提示: 可以定義多個 @Controller 將不同URL的處理方法分散在不同的類中

URL中的變量——PathVariable

在Web應用中URL通常不是一成不變的,例如微博兩個不同用戶的個人主頁對應兩個不同的URL: http://weibo.com/user1 , http://weibo.com/user2 。我們不可能對于每一個用戶都編寫一個被 @RequestMapping 注解的方法來處理其請求,Spring MVC提供了一套機制來處理這種情況:

@RequestMapping("/users/{username}")
public String userProfile(@PathVariable("username") String username) { return String.format("user %s", username); } @RequestMapping("/posts/{id}") public String post(@PathVariable("id") int id) { return String.format("post %d", id); }

在上述例子中,URL中的變量可以用 {variableName} 來表示,同時在方法的參數中加上 @PathVariable("variableName") ,那么當請求被轉發給該方法處理時,對應的URL中的變量會被自動賦值給被 @PathVariable 注解的參數(能夠自動根據參數類型賦值,例如上例中的 int )。

4.2 HTTP請求方法

對于HTTP請求除了其URL,還需要注意它的方法(Method)。例如我們在瀏覽器中訪問一個頁面通常是GET方法,而表單的提交一般是POST方法。 @Controller 中的方法同樣需要對其進行區分:

@RequestMapping(value = "/login", method = RequestMethod.GET)
public String loginGet() { return "Login Page"; } @RequestMapping(value = "/login", method = RequestMethod.POST) public String loginPost() { return "Login Post Request"; }

4.3 請求響應

在之前所有的 @RequestMapping 注解的方法中,返回值字符串都被直接傳送到瀏覽器端并顯示給用戶。但是為了能夠呈現更加豐富、美觀的頁面,我們需要將HTML代碼返回給瀏覽器,瀏覽器再進行頁面的渲染、顯示。

一種很直觀的方法是在處理請求的方法中,直接返回HTML代碼,但是這樣做的問題在于——一個復雜的頁面HTML代碼往往也非常復雜,并且嵌入在Java代碼中十分不利于維護。更好的做法是將頁面的HTML代碼寫在模板文件中,渲染后再返回給用戶。為了能夠進行模板渲染,需要將 @RestController 改成 @Controller :

import org.springframework.ui.Model; @Controller public class HelloController { @RequestMapping("/hello/{name}") public String hello(@PathVariable("name") String name, Model model) { model.addAttribute("name", name); return "hello" } }

在上述例子中,返回值 "hello" 并非直接將字符串返回給瀏覽器,而是尋找名字為 hello 的模板進行渲染,假如我們使用 Thymeleaf 模板引擎進行模板渲染,需要引入依賴:

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

接下來需要在默認的模板文件夾 src/main/resources/templates/ 目錄下添加一個模板文件 hello.html :

<!DOCTYPE HTML> <html xmlns:th="http://www.thymeleaf.org"> <head> <title>Getting Started: Serving Web Content</title> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> </head> <body> <p th:text="'Hello, ' + ${name} + '!'" /> </body> </html>

th:text="'Hello, ' + ${name} + '!'" 也就是將我們之前在 @Controller 方法里添加至 Model 的屬性 name 進行渲染,并放入 <p> 標簽中(因為 th:text 是 <p> 標簽的屬性)。模板渲染還有更多的用法,請參考 Thymeleaf官方文檔

4.4 處理靜態文件

瀏覽器頁面使用HTML作為描述語言,那么必然也脫離不了CSS以及JavaScript。為了能夠瀏覽器能夠正確加載類似 /css/style.css ,  /js/main.js 等資源,默認情況下我們只需要在 src/main/resources/static 目錄下添加 css/style.css 和 js/main.js 文件后,Spring MVC能夠自動將他們發布,通過訪問 /css/style.css ,  /js/main.js 也就可以正確加載這些資源。

5、實例:數據庫訪問

除了最基本的Web框架,另一種非常普遍的開發場景是訪問數據庫。在傳統的Spring應用中,訪問數據庫我們需要配置:

  • 類路徑上添加數據庫訪問驅動
  • 實例化 DataSource 對象,指定數據庫 url ,  username ,  password 等信息
  • 注入 JdbcTemplate 對象,如果使用 Hibernate , Mybatis 等框架,還需要進一步配置框架信息

在Spring Boot中,上述過程會被簡化。首先在Maven項目依賴中定義:

<dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-web-jdbc</artifactId>
</dependency>
<dependency>
 <groupId>com.h2database</groupId>
 <artifactId>h2</artifactId>
</dependency>

spring-boot-starter-web-jdbc 引入了 spring-jdbc 依賴, h2 是一個內存關系型數據庫。在引入了這些依賴并啟動Spring Boot應用程序后, autoconfigure 發現 spring-jdbc 位于類路徑中,于是:

  • 根據類路徑上的JDBC驅動類型(這里是 h2 ,預定義了 derby ,  sqlite ,  mysql ,  oracle ,  sqlserver 等等),創建一個 DataSource 連接池對象,本例中的 h2 是內存數據庫,無需任何配置,如果是 mysql ,  oracle 等類型的數據庫需要開發者配置相關信息。
  • 在Spring Context中創建一個 JdbcTemplate 對象(使用 DataSource 初始化)

接下來開發者的工作就非常簡單了,在業務邏輯中直接引入 JdbcTemplate 即可:

@Service
public class MyService {

 @Autowired
 JdbcTemplate jdbcTemplate;

}

除了 spring-jdbc ,Spring Boot還能夠支持JPA,以及各種NoSQL數據庫——包括MongoDB,Redis,全文索引工具 elasticsearch ,  solr 等等。

6、Production特性

從前面的例子可以看出,Spring Boot能夠非常快速的做出一些原型應用,但是它同樣可以被用于生產環境。為了添加生產環境特性支持,需要在Maven依賴中引入:

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

加入 actuator 依賴后,應用啟動后會創建一些基于Web的Endpoint:

  • /autoconfig ,用來查看Spring Boot的框架自動配置信息,哪些被自動配置,哪些沒有,原因是什么。
  • /beans ,顯示應用上下文的Bean列表
  • /dump ,顯示線程dump信息
  • /health ,應用健康狀況檢查
  • /metrics
  • /shutdown , 默認沒有打開
  • /trace

參考資料:

 

來自:http://blog.csdn.net/hguisu/article/details/50956370

 

Save

 本文由用戶 totl 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!