SpringBoot2-第一章:整合基礎框架

pc859107393發表於2018-05-27

在很早以前,我發過javaweb系列教程,探索了從spring框架的配置整合到springboot,中間還講解了一個部落格小專案。具體資訊請訪問:https://acheng1314.cn


快速搭建springboot2框架

本專案的GitHub:https://github.com/pc859107393/Go2SpringBoot.git

有興趣交流springboot進行快速開發的同學可以加一下下面的企鵝群。

行走的java全棧

為什麼要使用springboot?

在很早以前,我的專案中探索Spring+SpringMvc+Druid+Mybatis框架整合的時候,我們可是花了兩個章節詳細的討論spring框架的整合,同樣的哪怕是一個熟練的Java程式設計師要搭建一個完整穩定的框架也要很長的時間。 但是springboot解決了這個問題,筆者現在搭建一個springboot專案僅僅需要幾分鐘時間。下面我們一起一點點的看下去。

需要的工具

  • JDK1.8
  • IntelliJ IDEA 2018.1.4(目前我所使用的最低版本)
  • MySQL、Navicat或DataGrip
  • 構建工具:maven或gradle,推薦使用gradle,畢竟我用的gradle
  • 其他,後續使用到的地方我們持續跟進
  • git,使用是這個工具去我的github上面同步專案:https://github.com/pc859107393/Go2SpringBoot.git

建立專案

按照前面專案的國際慣例,使用IntelliJ IDEA構建專案,這一次還是像以前一樣貼出圖片。

①. 在idea的歡迎介面,我們選擇Create New Project,如圖1.1所示。

圖1.1

圖1.1 歡迎介面

②. 接著我們選擇左側的Spring Initializr然後點選next,進入Project Metadata介面,如圖1.2所示。

圖1.2

圖1.2 選擇Spring專案初始化

③. 緊接著開始配置專案的基本引數,我們在這裡一點點的實現,如圖1.3所示。

圖1.3

圖1.3 配置專案基本引數

在圖1.3中,我們需要著重注意的是: 專案型別設定為Gradle project,開發語言我選擇的是kotlin,打包方式jar,java語言版本是8,其他的引數大家自行百度

④. 完成了上面的專案引數配置後,我們接著選擇專案資源依賴。專案資源依賴也就是我們需要使用哪些jar包擴充套件。介面如圖1.4所示。

圖1.4

圖1.4 選擇專案依賴資源

在上面的圖1.4中,左邊是資源的父類別,中間是具體的資源詳細名稱,右邊是我們選中的依賴,同樣的已經把目錄層級展示出來了,大家請根據我選中的做出相應的選擇。注意:SpringBoot版本我們預設就行。

⑤. 當我們把圖1.4點選next後,進入了一個專案目錄命名環節,我們可以取自己心儀的名字。注意:寫完名字不要立即點選finish!寫完名字不要立即點選finish!寫完名字不要立即點選finish!

在這裡我們有一個很值得注意的小細節,在這裡我們可以加快專案構建速度。

 1. gradle專案的構建是需要gradle環境的。
 2. gradle和maven一樣是進行遠端資源依賴的,所以合理的遠端資源倉庫可以加快構建速度(資源下載速度快了,減少大部分等待時間)。
 3. 修改檔案內容 專案目錄->gradle->wrapper->gradle-wrapper.properties 中的distributionUrl的值為:http\://7xlmzq.com1.z0.glb.clouddn.com/gradle-4.5.1-bin.zip
 4. 在專案中的build.gradle檔案中修改repositories欄位相關的內容。新增如下內容:
 
    maven { url "http://maven.aliyun.com/nexus/content/repositories/central" }
複製程式碼

⑥. 做完這兩步後,我們就可以選擇finish進入專案中。 大概模樣如圖1.5所示。

圖1.5

圖1.5 專案構建完成

新增依賴資源

在傳統的JavaWeb應用中,我們一般採用經典三層來解決問題,經典三層指: dao->service->web,同樣的我們這裡也先來整合這三層。

①. 開啟build.gradle,檢視底部的dependencies包含哪些依賴。這個時候專案的依賴應該如下所示:

dependencies {
   //aop支援
   compile('org.springframework.boot:spring-boot-starter-aop')
   //快取
   compile('org.springframework.boot:spring-boot-starter-cache')
   //快捷生成RESTFul文件
   compile('org.springframework.boot:spring-boot-starter-data-rest')
   //模板引擎
   compile('org.springframework.boot:spring-boot-starter-freemarker')
   //資料校驗
   compile('org.springframework.boot:spring-boot-starter-validation')
   //傳統的web
   compile('org.springframework.boot:spring-boot-starter-web')
   //新的webflux
   compile('org.springframework.boot:spring-boot-starter-webflux')
   //mybatis的支援
   compile('org.mybatis.spring.boot:mybatis-spring-boot-starter:1.3.2')
   //Kotlin支援
   compile("org.jetbrains.kotlin:kotlin-stdlib-jdk8")
   compile("org.jetbrains.kotlin:kotlin-reflect")
   //springweb專案快速重啟
   runtime('org.springframework.boot:spring-boot-devtools')
   //mysql連結
   runtime('mysql:mysql-connector-java')
   //測試支援
   testCompile('org.springframework.boot:spring-boot-starter-test')
   testCompile('io.projectreactor:reactor-test')
   //在上面的依賴中 compile是任何時候都需要的依賴,runtime是緊緊在執行時需要依賴,testCompile是在測試的編譯和執行時候均需要。
}
複製程式碼

在以前我的系列教程中,我們主要採用了哪些框架呢?主要採用了:Spring+SpringMvc+Mybatis+Druid+SpringFox,所以這些組成一個完整web應用的框架集合是不能少的,所以我們需要加入下面的一些依賴。


    compile 'com.alibaba:druid-spring-boot-starter:1.1.9'

    compile 'com.google.code.gson:gson:2.7'
    //mybatis-plus外掛支援
    compile 'com.baomidou:mybatis-plus:2.3'
    compile 'com.baomidou:mybatis-plus-boot-starter:2.3'

    compile "io.springfox:springfox-swagger2:${springfoxVersion}"
    compile "io.springfox:springfox-staticdocs:2.6.1"
    compile "io.springfox:springfox-swagger-ui:${springfoxVersion}"
    compile 'com.github.xiaoymin:swagger-bootstrap-ui:1.7.2'
複製程式碼
  • 個人原因經常使用gson,上面的springfoxVersion='2.8.0'

接著我們重新整理gradle或者選擇右下角提示的 Import Changes,匯入我們加入的依賴資源。到這一步我們的依賴新增完畢。

框架整合

其實框架整合無外乎就是這些基於Spring的bean模式構建的各個bean協調工作,這一點在傳統手動配置的Spring應用中是一個很難很繁瑣的過程。但是我們springboot時代,一切都簡化了,我們只需要找到相應資源的官方文件,參照文件進行整合就行了。

我整合的配置檔案application.properties如下:

debug=false
trace=false

# Druid連線池配置,官方配置參考:https://github.com/alibaba/druid/tree/master/druid-spring-boot-starter
spring.datasource.druid.url=jdbc:mysql://localhost:3306/cc_db?useUnicode=true&characterEncoding=utf8&autoReconnect=true
spring.datasource.driver-class-name= com.mysql.jdbc.Driver
spring.datasource.druid.username=root
spring.datasource.druid.password=laopo5201314
spring.datasource.druid.initial-size=5
spring.datasource.druid.max-active=20
spring.datasource.druid.min-idle=10
spring.datasource.druid.max-wait=10
spring.datasource.druid.filters=stat,wall
spring.datasource.druid.filter.stat.log-slow-sql=true
spring.datasource.druid.filter.stat.slow-sql-millis=2000

# 配置StatFilter
spring.datasource.druid.filter.stat.db-type=mysql
spring.datasource.druid.aop-patterns= -cn.acheng1314.*

# 配置WallFilter
spring.datasource.druid.filter.wall.enabled=true
spring.datasource.druid.filter.wall.db-type=mysql
spring.datasource.druid.filter.wall.config.delete-allow=false
spring.datasource.druid.filter.wall.config.drop-table-allow=false

## Druid WebStatFilter配置,說明請參考Druid Wiki,配置_配置WebStatFilter
spring.datasource.druid.filter.stat.enabled=true
spring.datasource.druid.web-stat-filter.url-pattern=/*
spring.datasource.druid.web-stat-filter.exclusions=*.gif,*.png,*.jpg,*.html,*.js,*.css,*.ico,/druid/*
#
## Druid StatViewServlet配置,說明請參考Druid Wiki,配置_StatViewServlet配置
#spring.datasource.druid.stat-view-servlet.enabled=true
#spring.datasource.druid.stat-view-servlet.url-pattern=/druid/*
#spring.datasource.druid.stat-view-servlet.reset-enable=true
#spring.datasource.druid.stat-view-servlet.login-username=admin
#spring.datasource.druid.stat-view-servlet.login-password=admin
#spring.datasource.druid.stat-view-servlet.allow=
#spring.datasource.druid.stat-view-servlet.deny=

#事物提交失敗回滾和aop
spring.transaction.rollback-on-commit-failure=true
spring.aop.auto=true
spring.aop.proxy-target-class=true

spring.http.encoding.force=true
spring.http.encoding.force-request=true
spring.http.encoding.charset=utf-8
spring.http.converters.preferred-json-mapper=jackson
spring.servlet.multipart.enabled=true
spring.servlet.multipart.max-file-size=1024mb
spring.servlet.multipart.max-request-size=1024mb

#freemarker配置
spring.freemarker.template-loader-path=classpath:/templates/
spring.freemarker.cache=true
spring.freemarker.content-type=text/html
spring.freemarker.charset=UTF-8
spring.freemarker.check-template-location=true
spring.freemarker.enabled=true
spring.freemarker.suffix=.ftl
spring.freemarker.expose-request-attributes=true
spring.freemarker.expose-session-attributes=true
spring.freemarker.request-context-attribute=req

server.port=8181
spring.resources.static-locations=classpath:/static/

#Mybatis配置,官方參考:http://www.mybatis.org/spring-boot-starter/mybatis-spring-boot-autoconfigure/
mybatis.mapper-locations=classpath:/mapper/*.xml
mybatis.type-aliases-package=cn.acheng1314.base.domain
mybatis.configuration.map-underscore-to-camel-case=true
mybatis.configuration.use-generated-keys=true
mybatis.configuration.use-column-label=true

mybatis-plus.mapper-locations=classpath:/mapper/*.xml
mybatis-plus.type-aliases-package=cn.acheng1314.base.domain
#主鍵型別  0:"資料庫ID自增", 1:"使用者輸入ID",2:"全域性唯一ID (數字型別唯一ID)", 3:"全域性唯一ID UUID";
mybatis-plus.global-config.id-type=0
#欄位策略 0:"忽略判斷",1:"非 NULL 判斷"),2:"非空判斷"
mybatis-plus.global-config.field-strategy=0
#駝峰下劃線轉換
mybatis-plus.global-config.db-column-underline=true
#重新整理mapper 除錯神器
mybatis-plus.global-config.refresh-mapper=true
mybatis-plus.global-config.capital-mode=true
mybatis-plus.configuration.cache-enabled=true
mybatis-plus.configuration.map-underscore-to-camel-case=true
#配置檔案設定請參考官網文件:https://docs.spring.io/spring-boot/docs/2.0.2.RELEASE/reference/htmlsingle/#production-ready-endpoints
複製程式碼

在上面的配置檔案中,我們在專案開發目錄中resources對應編譯後的目錄為classes

至此為止,我們的框架整合差不多完成,具體的細節,我建議大家還是去官網文件檢視一下。當然最重要的還是框架整合的基礎思想,有興趣的童鞋可以檢視我以前的相關教程。

測試整合效果

①. 測試json輸出,程式碼如下:

   @GetMapping(value = ["/"], produces = [MediaType.APPLICATION_JSON_UTF8_VALUE])
   @ResponseBody
   fun MainLocal(): Any = User("程", "18976962315", "123456", "吹牛", Date())
複製程式碼

②. 測試freemarker頁面渲染

   @GetMapping(value = ["/test"], produces = [MediaType.TEXT_HTML_VALUE])
   fun getTest(map: ModelMap): String {
       map["test"] = MainLocal()
       return "test1"
   }
複製程式碼

具體的測試頁面不用再放出來了,同樣這種類似的測試也可以考慮使用Spring的相關測試框架來檢查。

相關文章