Spring Boot開發(Gradle+註解)

尤小碩發表於2019-09-14

更新中…
什麼是Gradle?

gradle(一種強大的專案構建工具)
    軟體專案構建:Java中常用的是Ant、Maven(Maven相對於Ant擁有強大的依賴配置)
    ·Gradle是個構建系統,能夠簡化你的編譯、打包、測試過程。(類比於Java中的Maven)
    ·Gradle Wrapper的作用是簡化Gradle本身的安裝、部署。(因為不同版本的專案可能需要不同版本的Gradle,手工部署比較按麻煩,而且可能產生衝突,所以需要Gradle Wrapper來搞定這些事情,當部署專案的時候,其會根據gradle-properties中的配置檔案進行對應版本的下載配置以及對應版本的gradle下載位置)

為什麼是Gradle而不是Maven?

  ·Gradle與Maven之間的區別(最大的不同就是Gradle比Maven靈活。體現在Maven在構建的時候每一步都依賴前面一個環節:編譯、測試、釋出等;以及maven在配置檔案方面使用的是XML檔案:格式過於冗長;Gradle可以擴充套件,可以將Gradle配置檔案和XML檔案進行轉換,以及可以使用Maven的倉庫即可以與其它構建工具進行整合等等這些區別)
    ·掌握gradle如下命令的使用:clean、build、列印依賴樹、war
        gradle clean (刪除build目錄)
        gradle build (構建並單元測試)
        gradle dependencies (列出所選專案的依賴列表)
        gradle buildEnvironment (列出build指令碼的依賴列表)
        gradle dependencyInsight (根據指定的輸入來輸出特定的依賴選項)
        war包:Java web專案打包後生成的檔案,打包後的war包可用於分發給tomcat伺服器

Gradle如何使用?

    ·->.\gradlew build --scan(構建審視)  
        build scan是一個可分享的構建過程的資訊集合,通過build scan可以觀察到構建過程中發生了什麼以及為什麼
        相關配置:在build.gralde中新增
            plugins { //使build scans能夠記錄專案的所有構建資訊
    			id 'com.gradle.build-scan' version '2.1' 
			} //其中,版本號建議設為最新
			buildScan { //接受許可資訊,從而可以允許你配置plugin塊
			    termsOfServiceUrl = 'https://gradle.com/terms-of-service'
			    termsOfServiceAgree = 'yes'
			}
		釋出build scan: .\gradlew build --scan(釋出成功後進入提供的連結,填寫郵箱進行檢視)
		建立一個初始化指令碼可以為所有的構建生成build scan (文件中是在根目錄下的.gradle資料夾中生成的指令碼,Linux系統下執行gradlew命令可能會自動呼叫該指令碼從而自動生成build scan,但是在win10環境下,該怎麼自動呼叫buildScan.gradle指令碼檔案?)
		->問題解決:win10環境下,home目錄在C盤使用者資料夾下的個人使用者賬號資料夾下,在哪裡你可以發現.gradle資料夾,按照上面的步驟進行操作即可。
		->生成buildScan.gradle檔案之後,若要檢視build scan,只需執行.\gradlew --scan之後就能成功生成build scan
	總結:
	    生成build scan
	    線上檢視build scan資訊
	    建立一個初始化指令碼可以為所有的構建生成build scan

    ·->.\建立新的gradle構建專案  
        新建一個資料夾,在該檔案目錄下:gradle init完成gradle構建專案初始化
        gradle提供介面用來建立和配置task
        gradle應用外掛和task進行配合使用
        .\gradlew task --scan (執行指定任務時 可以直接生成該任務的build scan)
        也可以通過.\gradlew properties 檢視配置資訊
	總結:
	    生成build scan
	    線上檢視build scan資訊
	    建立一個初始化指令碼可以為所有的構建生成build scan

    ·->.\建立一個多應用的專案(根專案下包含多個子專案) 
        新增一個Java應用子專案
	        確保某個子專案下的test能夠自己正常工作:
	            根據test中要使用的編碼內容,來確定子專案下的build.gradle中的配置資訊(包括外掛plugins、依賴dependencies)
	            代替重新構建整個專案的方法是單獨執行該test程式:.\gradlew :greeter:test (因為gradlew只存在在根目錄,為了不上尋目錄,可以使用 :greeter:test的方法來執行該test)
        新增文件(使用比較熱門的Asciidoctor tool):
            root專案下的build.gradle中新增:
            plugins {
			    id 'org.asciidoctor.convert' version '1.5.6' apply false 
			} //其中apply false表示向所有子專案新增該外掛除了root專案
			在頂層資料夾下新建一個子專案docs,並在docs下新建gradle script:build.gradle
			plugins {
			    id 'org.asciidoctor.convert' 
			}

			asciidoctor {
			    sources {
			        include 'greeter.adoc'   
			    }
			}

			build.dependsOn 'asciidoctor' 
			
			在root專案中的settings.gradle中更改配置,使其包含子專案docs: include 'docs'
			在docs/src/docs/asciidoc/greeter.adoc中新增內容(有特定語法格式)
			執行.\gradlew asciidoctor後即可看到相關html文件   
	總結:
	    
    ·->.\構建Java庫 
        通過命令:gradle init --type java-library(初始化gradle構建java-library專案,可供選擇的項由basic、cpp-application、cpp-library、groovy-application、groovy-application、groovy-library、java-application、java-library、kotlin-application、kotlin-library、scala-library)
        初始化java-library專案之後,執行命令.\gradlew build即可構建完成專案(可以在build/reports/tests/test/index.html檔案中檢視構建過程的日誌)
        對構建java-library後生成的jar包進行測試 (jar tf build/libs/building-java-libraries.jar)
        配置build.gradle:在其中新增version = '0.1.0',執行jar task: .\gradlew jar (在build/libs中生成了0.1.0版本的該專案的jar包)
        修改META-INF/MANIFEST.MF中的預設資訊:
            配置build.gradle:
            jar {
			    manifest {
			        attributes('Implementation-Title': project.name,
			                   'Implementation-Version': project.version)
			    }
			}
			.\gradlew jar重新執行jar task
			jar xf build/libs/building-java-libraries-0.1.0.jar META-INF/MANIFEST.MF
		執行.\gradlew javadoc後在build/docs/javadoc/index.xml中檢視文件
	總結:
	    META-INF/MANIFEST.MF(清單檔案關於JAR包的描述資訊、啟動時的配置資訊和安全性資訊等均儲存在其中,可以理解為jar的一個'配置檔案')	    

    ·->.\構建Java應用
        同構建Java庫
        .\gradlew tasks 可以列出tasks(其中有一個run task)
        .\gradlew run 即可執行main中的APP
	總結:
   
    ·->.\構建Java Web應用
        手動新建一個樹形檔案目錄:
        webdemo/
		    src/
		        main/
		            java/
		            webapp/
		        test
		            java/
		在根目錄下生成gradle wrapper: gradle wrapper --gradle-version=**.**.**(需要注意版本,要到官網去檢視版本是否填寫正確,否則會始終報錯,到你懷疑人生的那種)
	總結:

遇到的註解:

通過 @Qualifier 註釋指定注入 Bean 的名稱,這樣歧義就消除了(對於有多個Bean時這樣用,即可消除歧義)
註解裡的引數必須時常數(constant)
常數必須要有初始值
@JsonIgnoreProperties註解:
  放在類上面,作用是忽略類中不存在的欄位當接收的時候
@JsonProperty註解:
  放在欄位上面,作用是與前端返回的欄位進行對映(註解裡的屬性值是前端返回的欄位值)
@Transactional(rollbackFor = Exception.class)
   異常:
       可查的異常:Exception下除了RuntimeException之外的異常 Java編譯器要求必須對其進行捕獲
       不可查異常:RuntimeException及其子類和錯誤Error 
     @Transactional的寫法:
       Spring框架的事務基礎架構程式碼將 預設 地只在丟擲執行時和unchecked exceptions時才標識事務回滾
       ->讓checked例外也進行回滾:@Transactional(rollbackFor = Exception.class)
       ->讓unchecked例外不回滾:@Transactional(notRollbackFor = RunTimeException.class)
       ->不需要事務管理的(只查詢的)方法:@Transactional(propagation = Propagation.NOT_SUPPORTED)
     注:若異常被try{} catch {}了,事務就不回滾了,若想讓事務回滾必須再往外拋try{} catch{throw Exception}
   @RequestBody: 可以解析請求資料body中的json格式資料
   @Data:註解在類上,為類提供讀寫屬性,此外還提供了equals()、hashCode()、toString()方法
   @TableName("***"):在實體類上,用於自動匹配實體類對應的表
   @JsonIgnoreProperties(ignoreUnknown = true):用於實體類,忽略類中不存在的欄位當接收的時候
   @TableId(type = IdType.AUTO):實體類主鍵策略,在實體類中的屬性上增加註解即可
   @TableField(value = "createTime"):即資料表中的欄位名與實體類中的屬性進行對映,並且還有其他功能:
     @TableField(exist = false): 表示該屬性不為資料庫表欄位,但又是必須使用的
     @TableField(exist = true):表示該屬性為資料庫表欄位
     @TableField(condition = SqlCondition.LIKE):表示該屬性可以模糊搜尋
     @TableField(fill = FieldFill.INSERT):註解填充欄位,生成器策略部分也可以配置
   @NotNull:被註釋的元素不能為null
   @Slf4j:註解在類上,為類提供了屬性名為log的log4j的日誌物件
   @Log4j:註解在類上,為類提供了屬性名為log的log4j的日誌物件
   @PostMapping:對映一個POST請求
   @GetMapping:對映一個GET請求
   @DeleteMapping:對映一個DELET請求
   @EqualsAndHashCode:
     此註解會生成equals(Object other) 和hashCode()方法
     預設使用非靜態,非瞬間的屬性
     可通過引數exclude排除一些屬性
     可通過引數of指定僅使用那些屬性
     它預設僅使用該類中定義的屬性且不呼叫父類的方法
     在使用@Data時同時加上@EqualsAndHashCode(callSuper=true)註解

Controller、Service、DAO專案構建示例



DAO:
	  updater varchar 128 COMMENT '更新人'     #更新人則是必須進行校驗的欄位,每次更改,都會獲取當前使用者資訊,與資料庫不符就更新否則不操作
	  descriptor text 0 COMMENT '叢集描述資訊'  #描述資訊是可以選擇填寫的,如果前端傳來這個欄位,就寫入資料庫
	  
	  @Insert("INSERT INTO ... (..., `updater`, `descriptor`) VALUES (..., #{item.userNumber}, #{descriptor}) ") #accountService.getLoginUserNumber()
	  void addYarnCluster(@Param("item") YarnCluster yarnCluster);

	  @Update("UPDATE etl_yarn_cluster SET yarnName = #{item.yarnName}, ... , #{item.updater}, #{item.descriptor}"
	      + " WHERE ...")
	  void updateYarnCluster(@Param("item") YarnCluster yarnCluster);

      class YarnCluster {
        ...
        private String descriptor;
      }

  Service:
      Service層過於簡單,也不用動(我jio得Controller層的業務邏輯應該移到Service)

  Controller: //Controller層可以不用動
      @RequestMapping("addYarnCluster"))
      public CommonVO<Boolean> addYarnCluster(@RequestBody String jsonStr) {
      }
xxxService extends IService<T>
xxxServiceImpl extends ServiceImpl<M extends com.baomidou.mybatisplus.mapper.BaseMapper<T>, T>
xxxMapper extends BaseMapper<T>
組裝查詢條件:
  Wrapper:
	  Wrapper<T> entityWrapper = new EntityWrapper<>();
	  Wrapper<T> where(boolean condition, String sqlWhere, Object... params); (ew.where("name='zhangsan'").where("id={0}", "123");)
	  Wrapper<T> eq(boolean condition, String column, Object params); (等同於SQL的"field=value"的表示式)
	  Wrapper<T> ne(boolean condition, String column, Object params); (等同於SQL的"field<>value"的表示式)
	  Wrapper<T> and(boolean condition, String sqlAnd, Object... params); (ew.where("name='zhangsan'").and("id=11").andNew("statu=1")輸出WHERE (name='zhangsan' AND id=11) AND (statu=1))
	  Wrapper<T> like(boolean condition, String column, String value); (LIKE條件語句,value中無需前後%)
	  T getEntity();
	  void setEntity(T entity);

  ServiceImpl:
      Page<T> selectPage(Page<T> page, Wrapper<T> wrapper);
  @Data
@JsonIgnoreProperties(ignoreUnknown = true)
@EqualsAndHashCode(callSuper = true)
public class ReqRequirementQuery extends BaseQuery implements Serializable {

  //當前使用者
  private String userNumber;

  //需求標題 模糊搜尋
  private String requirementTitle;
  //需求topic 模糊搜素
  private String topic;
  //需求狀態
  private int requirementStatus;

  //需求資訊
  private String updater;

}
列印日誌層級:[ALL < TRACE <] DEBUG < INFO < WARN < ERROR [< FATAL < OFF](如果將log level設定在某個級別上,則比此級別優先順序高的log都能列印出來)
異常:Exception和Throwable之間的區別
  catch throwable會把Error和其他繼承Throwable的類捕捉到;catch Exception只會捕捉Exception及其子類,捕捉的範圍更小



更多Spring Boot例項請參考 @程式猿DD

相關文章