Spring Boot開發(Gradle+註解)
更新中…
什麼是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
相關文章
- Spring boot註解Spring Boot
- Spring 註解開發Spring
- spring註解開發Spring
- spring boot 註解@ComponentSpring Boot
- Spring Boot註解 之 @RequestXSpring Boot
- Spring Boot 自定義註解Spring Boot
- Spring的註解開發Spring
- Spring Boot入門(四):開發Web Api介面常用註解總結Spring BootWebAPI
- Spring Boot 自定義註解失效Spring Boot
- Spring Boot配置類的註解Spring Boot
- 【Spring註解驅動開發】聊聊Spring註解驅動開發那些事兒!Spring
- Spring Boot系列十八 Spring AOP + 註解實現統一註解Spring Boot
- Spring註解開發_Spring容器建立概述Spring
- spring boot的常用註解有哪些?Spring Boot
- Spring-05 使用註解開發Spring
- spring註解開發(一)Bean注入SpringBean
- MyBatis 註解版(五)Spring boot 註解系列 插入物件返回 idMyBatisSpring Boot物件
- Spring Boot 自動配置之條件註解Spring Boot
- Spring Boot 自動配置之組合註解Spring Boot
- spring boot使用註解的方式整合mybaitsSpring BootAI
- spring boot 註解物件的問題 待研究Spring Boot物件
- Spring Boot 的 Web 開發Spring BootWeb
- Spring Boot註解@Transactional結合實際例子講解Spring Boot
- 你的開發利器Spring自定義註解Spring
- Spring學習之05使用註解開發Spring
- Spring Boot第五彈,WEB開發初瞭解~Spring BootWeb
- Spring Boot + Maven 多模組專案開發詳解Spring BootMaven
- Spring7——開發基於註解形式的springSpring
- 【Spring註解驅動開發】使用@Lazy註解實現懶載入Spring
- Spring / Spring boot 基於註解非同步程式設計@AsyncSpring Boot非同步程式設計
- Spring Boot 自動配置之@Enable* 與@Import註解Spring BootImport
- spring boot使用@Async非同步註解,原理+原始碼Spring Boot非同步原始碼
- spring boot啟動掃描不到自定義註解Spring Boot
- 註解開發
- spring boot + vue + element-ui全棧開發入門——spring boot後端開發Spring BootVueUI全棧後端
- 開發一個Spring Boot Starter!Spring Boot
- Spring Boot(二):Web 綜合開發Spring BootWeb
- Spring Boot (二):Web 綜合開發Spring BootWeb