12月最后一个月,明天就是2020年了,回顾2019,感觉成长了许多,2020,希望能继续保持对技术的热情,做自己喜欢做的事,明年,也将毕业啦,从此便是社会人。🏷️
1. JRebel实现热部署减少重启时间
平时我们在开发中总是需要不断修改Service层或者其他层的代码,这时候如果项目大的话,重启一次要几十秒,这是十分痛苦的事情,这时候热部署就生效了。
这里使用JRebel的热部署,在IDEA中装插件就可以了。破解的话需要半年一次。
- 破解可以参考这篇文章
- 然后需要重新生成id,在这
- 然后填写具体路径即可。http://127.0.0.1:8888/e4188520-e963-484e-ae3d-e42b4b0861ee
- 然后在项目中就能用了,直接右键即可。
2.使用Mybatis-plus自动填充创建时间和修改时间
创建时间和修改时间都是平时在插入数据或者修改数据时都是要新建或者修改的,不必要每次都去修改,可以使用Mybatis-plus 的自动填充功能。
实现元对象处理器接口:com.baomidou.mybatisplus.core.handlers.MetaObjectHandler
@Component public class MetaObjectHandlerConfig implements MetaObjectHandler { @Override public void insertFill(MetaObject metaObject) { Object createTime = getFieldValByName("createdAt", metaObject); Object updateTime = getFieldValByName("updatedAt", metaObject); if (createTime == null){ setFieldValByName("createdAt", LocalDateTime.now(), metaObject); } if (updateTime == null){ setFieldValByName("updatedAt", LocalDateTime.now(), metaObject); } }
注解填充字段 @TableField(fill = FieldFill.INSERT) !
@TableField(fill = FieldFill.INSERT) private LocalDateTime createdAt; @TableField(fill = FieldFill.INSERT_UPDATE) private LocalDateTime updatedAt;
- 字段必须声明TableField注解,属性fill选择对应策略,该申明告知 Mybatis-Plus 需要预留注入 SQL 字段。
- 填充处理器MyMetaObjectHandler 在 Spring Boot 中需要声明@Component 注入。
- 必须使用父类的setFieldValByName()或者setInsertFieldValByName/setUpdateFieldValByName方法,否则不会根据注解FieldFill.xxx来区分。
3.常用注解的学习
1. @Profile: 指示一个或多个指定配置文件处于活动状态时,就执行,官方文档解释,这里指定环境为prod生产环境时运行。执行相应内容,输出文字。
2. @Value 注解为读取配置文件的内容。
spring:
profiles:
active: prod
3. @Bean注解
Spring的@Bean注解用于告诉方法,产生一个Bean对象,然后这个Bean对象交给Spring管理。产生这个Bean对象的方法Spring只会调用一次,随后这个Spring将会将这个Bean对象放在自己的IOC容器中。
4. @JsonView和@JsonProperty注解
@JsonView可以过滤序列化对象的字段属性,可以使你有选择的序列化对象。一般用的比较多的地方就是在返回的VO或者属性上指定哪些不需要返回,然后在Controller上用@JsonView指定哪个方法用哪个过滤条件,这个还有继承的机制,也可以使用了解下。
JsonView参考
@JsonProperty的话是定义在属性上,当你需要指定返回的属性跟前端约定的名称不同时,或者前端dto传入参数跟你的bean属性名不同,这个时候就可以在属性上面@JsonProperty注解指定名称。
5. @JsonInclude注解
@JsonInclude(JsonInclude.Include.NON_NULL)作用在类上的话表示如果这个类中的属性如果值为null,则不返回。感觉还是很好用的。
6. @EnumVerify注解
@EnumVerify注解,可以在DTO入参的时候对参数指定枚举的类型判断,这样就不用在代码中判断啦。
@EnumVerify(message = "请选择正确的客户类型", enumClass = CustomerType.class)
private Integer type;
4.Patch请求和Put请求应使用x-www-form-urlencoded方式传递参数
在使用Patch和put请求时,body中的请求参数方式要改为x-www-form-urlencoded。
5.SQL常用函数
- IFNULL(v1,v2) 函数
如果第一个参数 为 NULL,则返回第二个参数的备用值,其实跟CASE WHEN THEN差不多,只是更加简洁明了了。 - CONCACT 用于将多个字符串连接起来,形成一个单一的字符串。
- CASE WHEN THEN ELSE THEN END CASE 表示函数开始,WHEN THEN 表示条件成立后做什么,END 表示函数结束
6.@NotEmpty、@NotBlank、@NotNull
平时我们一般会在DTO的入参上使用validate的注解,这三种算是比较常见的吧。
@NotEmpty 用在集合类上面
用@NotEmpty修饰的String类、Collection、Map、数组,是不能为null或者长度为0的(String Collection Map的isEmpty()方法)@NotBlank只用于String,不能为null且trim()之后size>0
@NotNull:不能为null,但可以为empty,没有Size的约束
7. Maven依赖范围
Maven有以下几种依赖范围:
- compile:编译依赖范围,使用此依赖范围对于编译、测试、运行三种classpath都有效,即在编译、测试和运行时都要使用该依赖jar包;
- test:测试依赖范围,只对测试有效,表明只在测试的时候需要,在编译和运行时将无法使用该类依赖,如 junit;
- provided:已提供依赖范围。编译和测试有效,运行无效。如servlet-api,在项目运行时,tomcat等容器已经提供,无需Maven重复引入;
- runtime:运行时依赖范围。测试和运行有效,编译无效。如 jdbc 驱动实现,编译时只需接口,测试或运行时才需要具体的 jdbc 驱动实现;
- system:系统依赖范围,使用system范围的依赖时必须通过systemPath元素显示地指定依赖文件的路径,不依赖Maven仓库解析。
在默认依赖范围的情况下,传递性依赖也是有条件的。
- 当第二直接依赖为compile时,则依赖关系以第一直接依赖为准;
- 当第二直接依赖为test时,则没有依赖关系;
- 当第二直接依赖为provided时,只有第一直接依赖也为provided时才有provided范围的依赖关系;
- 当第二直接依赖为runtime时,除了第一直接依赖关系为compile时依赖范围为runtime,其他三种皆与第一直接依赖范围相同。
依赖冲突的调节:
A -> B -> C -> X (1.0)
A -> D -> X (2.0)
由于只能引入一个版本的包 , 此时 Maven 按照最短路径选择导入 X (2.0)
A -> B -> X (1.0)
A -> D -> X (2.0)
路径长度一致 , 则优先选择第一个 , 此时导入 X (1.0)