springBoot探索(1)——分析

pc859107393發表於2019-03-03

前兩季完成了spring+springMvc+mybatis+Druid+Shiro+Ehcache框架的整合、使用。同時也展開了對專案簡單重構,更多的時候我們學會了利用框架偷懶。

當然本著偷懶精神,同時帶著群友的呼聲,我們不妨來看看springBoot相關的資訊。

但是要明白一點,無論以前還是現在,spring相關的只要核心沒變,就算外在形式變化了,只要我們保證實質不變化,那麼還是差不多沒變的。

本專案github倉庫:github.com/pc859107393…

本專案國內碼雲倉庫:git.oschina.net/859107393/M…


本系列為連載文章。當然如果你沒有spring基礎,建議你先看看我的java手把手教程

當然我的簡書訪問速度更快

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

行走的java全棧
行走的java全棧

分析springboot。

首先百度一下springboot、springmvc的區別。

Spring MVC 是基於 Spring 的一個 渲染web的MVC 框架。

Spring Boot 是基於 Spring 的條件註冊的一套快速開發整合包。

大概意思就是上面這樣描述,對不對呢?其實我們根據以往的經驗,再去看看springboot的源包也就可以看到大概了。

引入springboot

我們還是一樣進行gradle引入。

// https://mvnrepository.com/artifact/org.springframework.boot/spring-boot
compile group: `org.springframework.boot`, name: `spring-boot`, version: `1.5.4.RELEASE`複製程式碼

在gradle自動引入依賴完成後,我們可以看到springboot自動引入瞭如下資源:

  • spring-boot:1.5.4.RELEASE
    • spring-aop:4.3.9.RELEASE
    • spring-beans:4.3.9.RELEASE
    • spring-context:4.3.9.RELEASE
    • spring-core:4.3.9.RELEASE
    • spring-expression:4.3.9.RELEASE

到了這裡我們就可以明白上面對springBoot的概述。也就是自動註冊一堆框架提供給我們使用。

那麼,我們能不能快速的整合更多的框架呢?

首先我在spring4all社群找到了一款整合了Druid的快速啟動框架:druid-spring-boot。同時,我還看到了泥瓦匠BYSocket寫的springBoot教程。所以,我找到了更為快捷的辦法。

繼續gradle引入資源:

//druid-spring-boot-starter
compile(`com.github.drtrang:druid-spring-boot-starter:1.0.3`) {
    exclude group: `com.alibaba`
}複製程式碼

在上面的程式碼中,exclude group: `com.alibaba`的意思是排除組織是com.alibaba的包。為什麼排除呢?主要是作者用的阿里巴巴的包相對舊一點和他github上面的包不一致。

接著我們一次把需要的包全部匯入,如下:

compile `com.alibaba:druid:1.1.2`
// https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-parent
compile `org.springframework.boot:spring-boot-starter-parent:1.5.4.RELEASE`
// https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-web
compile `org.springframework.boot:spring-boot-starter-web:1.5.4.RELEASE`

runtime `mysql:mysql-connector-java:5.1.39`

testCompile `org.springframework.boot:spring-boot-starter-test:1.5.4.RELEASE`複製程式碼

可以看到我們再次匯入了Druid。同時,我們匯入了:

  • spring-boot-starter-parent
  • spring-boot-starter-web
  • mysql-connector
  • spring-boot-starter-test

有了上面的包後,我們接著是刪掉前面的spring-boot,畢竟springboot太大了。,所以最後我們gradle目前的引入資源是:

dependencies {
    testCompile group: `junit`, name: `junit`, version: `4.12`

    // https://mvnrepository.com/artifact/org.mybatis.spring.boot/mybatis-spring-boot-starter
    compile `org.mybatis.spring.boot:mybatis-spring-boot-starter:1.3.0`

    compile `com.squareup.okhttp3:okhttp:3.8.1`

    //druid-spring-boot-starter
    compile(`com.github.drtrang:druid-spring-boot-starter:1.0.3`) {
        exclude group: `com.alibaba`
    }

    compile `com.alibaba:druid:1.1.2`
    // https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-parent
    compile `org.springframework.boot:spring-boot-starter-parent:1.5.4.RELEASE`
    // https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-web
    compile `org.springframework.boot:spring-boot-starter-web:1.5.4.RELEASE`

    runtime `mysql:mysql-connector-java:5.1.39`

    testCompile `org.springframework.boot:spring-boot-starter-test:1.5.4.RELEASE`
}複製程式碼

這個時候我們直接新建一個類,來啟動springboot。

/**
 * Spring Boot 應用啟動類
 *
 * @author acheng
 */
@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        // 程式啟動入口
        // 啟動嵌入式的 Tomcat 並初始化 Spring 環境及其各 Spring 元件
        SpringApplication.run(Application.class,args);
    }
}複製程式碼

如無意外,這裡絕對是報錯(提示我們Druid需要的DataSource建立失敗,然後結束執行)。哈哈哈,大家肯定覺得筆者是傻瓜,為什麼明明知道有錯還哈哈哈。這裡其實涉及到一個問題,那就是框架整合以及框架需要的配置支援,當然這個在springboot中叫做約定!

我們看一下匯入的Druid-Starter相關的專案介紹!

框架作者明顯告訴我們需要建立一個application.yml的約定檔案來配置Druid相關的引數。

偷懶直接引入作者的檔案,再作適當的修改,結果如下:

debug: false

logging:
  level:
    root: info
    org.springframework: info
    org.springframework.jdbc: debug
    org.mybatis: debug
    com.github.trang: debug

spring:
  profiles:
    # 預設環境為 default,多資料來源演示請改為請參考git上面的demo
    active: default
  output:
    ansi:
      enabled: always
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://localhost:3306/ccdb?useUnicode=true&characterEncoding=utf8&autoReconnect=true
    username: root
    password: laopo5201314
    druid:
      # spring.datasource.druid 字首的配置將注入到 DruidParentDataSource,作為公共引數
      initial-size: 1
      min-idle: 1
      max-active: 10
      max-wait: 30000
      time-between-eviction-runs-millis: 60000
      min-evictable-idle-time-millis: 1800000
      max-evictable-idle-time-millis: 25200000
      validation-query: SELECT 1
      test-while-idle: true
      test-on-borrow: true
      test-on-return: false
      pool-prepared-statements: true
      max-open-prepared-statements: 20
      use-global-data-source-stat: true
      stat:
        db-type: mysql
        log-slow-sql: true
        slow-sql-millis: 1000
        merge-sql: true
      slf4j:
        enabled: true
        connection-log-enabled: false
        connection-log-error-enabled: true
        statement-log-enabled: false
        statement-log-error-enabled: true
        statement-sql-pretty-format: true
        statement-executable-sql-log-enable: true
        result-set-log-enabled: false
        result-set-log-error-enabled: true
      wall:
        enabled: true
        db-type: mysql
        log-violation: true
        throw-exception: false
        config:
          select-all-column-allow: false
      config:
        enabled: false #關閉密碼加密(為true時候需要利用Druid進行加密資料庫密碼)
      aop-stat: #aop狀態監測
        enabled: true
        patterns:
          - acheng1314.cn.*
      web-stat: #web狀態監測
        enabled: true
      stat-view-servlet:    #開啟Druid的web監測頁面
        enabled: true
  transaction:
    rollback-on-commit-failure: true
  aop:
    auto: true
    proxy-target-class: true
  http:
    encoding:
      force: true
    converters:
      preferred-json-mapper: gson

# 開始設定mybatis,具體的意思請參照我前面的的手把手教程
mybatis:
  type-aliases-package: acheng1314.cn.domain
  mapper-locations: "classpath:acheng1314/cn/dao/*.xml"
  configuration:
    map-underscore-to-camel-case: true
    use-generated-keys: true
    use-column-label: true

---

debug: false

spring:
  profiles: default複製程式碼

關於上面的配置檔案其實沒有多大的必要仔細闡述,畢竟大部分都是Druid的配置!上面Druid-Starter和我以前專案的配置檔案互相參考基本可以完成這些配置。同時我在上面把mapper和dao扔到了一起。


接著我們可以啟動專案來看看,我們預設的首頁可以再網頁上面輸出一串json,如下:

springBoot主頁
springBoot主頁

程式碼也是很簡單,大概如下:

@RestController
public class HelloWorldController {

    @GetMapping(value = "/", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
    @ResponseBody
    public Object sayHello() {
        Map<String, Object> map = new HashMap<>();
        map.put("aaa", "aaaa");
        return map;
    }
}複製程式碼

其實到這裡,目前的專案已經差不多了。但是,這不是我們的目標,我們還應該考慮APIDocs、快取、許可權驗證等等。


接入APIDocs——>SpringFox

相對來說,這個就是容易的多了。

引入資源

compile "io.springfox:springfox-swagger2:2.7.0"
compile "io.springfox:springfox-staticdocs:2.6.1"
compile "io.springfox.ui:springfox-swagger-ui-rfc6570:1.0.0"複製程式碼

引入對應的設定

在這裡所謂的引入設定,我們完全可以是配置java程式碼

@EnableSwagger2
public class SwaggerConfiguration {
    @Bean
    public Docket createRestApi() {
        return new Docket(DocumentationType.SWAGGER_2)  //Docket,Springfox的私有API設定初始化為Swagger2
                .select()
                .paths(PathSelectors.any())
                .build()
                .apiInfo(new ApiInfoBuilder()   //設定API文件的主體說明
                        .title("acheng的SpringBoot探索之路ApiDocs")
                        .description("acheng的SpringBoot探索之路")
                        .version("v1.01")
                        .termsOfServiceUrl("http://acheng1314.cn/")
                        .build());

    }
}複製程式碼

到了這裡,我們並沒有完,還需要簡單的把SpringFox的配置注入到專案中。如下:

/**
 * Spring Boot 應用啟動類
 *
 * @author acheng
 */
@SpringBootApplication
@MapperScan("acheng1314.cn.dao")    //提供dao檔案
@EnableWebMvc
@ComponentScan(basePackages = "acheng1314.cn.controller")
@Import(SwaggerConfiguration.class)
public class Application extends WebMvcConfigurerAdapter {

    public static void main(String[] args) {
        // 程式啟動入口
        // 啟動嵌入式的 Tomcat 並初始化 Spring 環境及其各 Spring 元件
        SpringApplication.run(Application.class, args);
    }

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("swagger-ui.html")
                .addResourceLocations("classpath:/META-INF/resources/");

        registry.addResourceHandler("/webjars/**")
                .addResourceLocations("classpath:/META-INF/resources/webjars/");
    }
}複製程式碼

然後我們啟動專案,在瀏覽器位址列中輸入:

http://localhost:8080/swagger-ui.html#/
http://localhost:8080/druid
http://localhost:8080/複製程式碼

上面這幾個地址均能正常訪問! 仔細看看是不是比當初我們的spring+springMvc+Druid+mybatis整合更加容易呢?本期專案到這裡就算是結束了。


如果你認可我所做的事情,並且認為我做的事對你有一定的幫助,希望你也能打賞我一杯咖啡,謝謝。

支付寶捐贈
支付寶捐贈

相關文章