Bootstrap

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

;