[原]Spring Boot(1)-快速構建應用
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的應用在大多數情況下都不需要我們去顯式地聲明各類配置,而是將最常用的默認配置作為約定,在不聲明的情況下也能適應大多數的開發場景。
-
SpringApplication 是Spring Boot框架中描述Spring應用的類,它的 run() 方法會創建一個Spring應用上下文(Application Context)。另一方面它會掃描當前應用類路徑上的依賴,例如本例中發現 spring-webmvc (由 spring-boot-starter-web 傳遞引入)在類路徑中,那么Spring Boot會判斷這是一個Web應用,并啟動一個內嵌的Servlet容器(默認是Tomcat)用于處理HTTP請求。
-
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表示刪除。
-
@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
參考資料:
- 參考 Spring Boot 項目的 官方網站 ,了解更多信息。
- 查看 Spring Boot 的 參考文檔 ,學習更多關于 Spring Boot 的用法。
- 查看 InfoQ 上關于 Spring Boot 的介紹文章。
- 下載 Spring Boot 命令行工具 。
- developerWorks Java 技術專區 。
來自:http://blog.csdn.net/hguisu/article/details/50956370
Save