月度记录-2024-10月

145 阅读10分钟

1. maven clean

maven clean 是 Maven 的一个生命周期阶段命令,用于清理项目中的生成文件。具体来说,它会删除项目目录中的 target 文件夹,该文件夹通常存放 Maven 构建过程中生成的文件,比如编译的 .class 文件、JAR 包、WAR 包等。

2. @ConfigurationProperties

这是Spring Boot提供的一个注解,用于将外部配置属性绑定到Java对象上。通过使用这个注解,开发者可以将配置文件(如application.properties或application.yml)中的属性值自动映射到Java类的字段上。

以前用的都是绑定单个配置项,太low,这样直接处理成一个bean,使用就很方便,注入它!

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import lombok.Data;

@Component // 将该类注册为Spring Bean,使其可以被Spring容器管理
@ConfigurationProperties(prefix = "app") // 指定配置属性的前缀为app
@Data
public class AppProperties {

    private String name;
    private String version;
    private boolean enabled;
}

3. 聚合根

聚合根是领域驱动设计(DDD)中的一个概念,指的是一个聚合的主要实体,它负责维护聚合内部其他实体和对象的一致性。聚合根是访问聚合的唯一入口,确保在处理聚合内的业务逻辑时,所有相关实体的状态保持一致。

4. java16 record

record适合用来表示数据对象,例如 DTO、配置对象或任何不需要修改的状态。减少了样板代码(boilerplate)。record 提供了一种简洁的方式来创建不可变的数据类,自动生成构造函数、访问器、equals()、hashCode() 和 toString() 方法。

  1. 简化语法:使用 record 可以减少 boilerplate 代码。例如,你不需要手动编写构造函数、访问器和其他常用方法。

  2. 不可变性:record 默认是不可变的(immutable),一旦创建后,字段的值不能被修改。这使得 record 适合用于表示数据传输对象(DTO)或模型。

  3. 内置功能:

    public record Person(String name, int age) { }

    // 使用示例 public class Main { public static void main(String[] args) { Person person = new Person("Alice", 30); System.out.println(person.name()); // 输出: Alice System.out.println(person.age()); // 输出: 30 System.out.println(person); // 输出: Person[name=Alice, age=30] } }

5. MyBatis-Plus @EnumValue

public enum UserStatus {   
     ACTIVE(1, "Active"),  
     INACTIVE(0, "Inactive"); 
     @EnumValue
     private final int code;  
     privatefinal String description;
     ......
}  

private UserStatus status; // 枚举类型字段
如此,在实体类中便可以用使用枚举,在查询和插入的时候会自动映射。

6. isxxx方法,序列化时自动执行,且多返回一个字段xxx

public class A { public boolean isxxx(){ return false; } }

许多序列化库(如Jackson)遵循Java Bean规范,自动将以is或get开头的方法视为属性的访问器。根据这个规范,isPass被视为pass属性,因而在序列化时会包含这个返回值。

如果你想避免这种行为,可以:

  1. 使用@JsonIgnore注解:这样可以明确指示序列化库忽略该方法。
  2. 更改方法名:将其重命名为getPass,以避免自动识别。

7. @JsonProperty

@JsonProperty 注解是 Jackson 库中的一个重要注解,用于在序列化和反序列化 Java 对象时指定 JSON 属性的名称和其他特性。

@JsonProperty("user_name")
private String username;

8. mybatisplus乐观锁

其实就是执行update的时候加了一个 and version = xxx,适合读多写少的场景。

9. idea Invalidate Caches

Invalidate Caches/Restart是IDEA工具中的一个清理缓存和重启工具的选项。当您遇到IDEA工具中的编译错误、运行错误或调试问题时,您可以尝试使用此功能来清除缓存并重新启动IDEA,以解决潜在的问题。

10. 前后端传参,涉及到数字要用String

因为前端在数字过长的情况下会丢失精度。

11. springboot国际化

private final MessageSource messageSource;
private final LocaleResolver localeResolver;

12. String.repeat(count);

是 Java 11 引入的方法,它用于将一个字符串重复指定次数,并返回新的字符串。

public static void main(String[] args) {
      String str = "Hello";
        
      // 将字符串重复3次
      String result = str.repeat(3);
        
      System.out.println(result);  // 输出:HelloHelloHello
}

13. liteflow规则引擎

LiteFlow适用于拥有复杂逻辑的业务,比如说价格引擎,下单流程等,这些业务往往都拥有很多步骤,这些步骤完全可以按照业务粒度拆分成一个个独立的组件,进行装配复用变更。使用LiteFlow,你会得到一个灵活度高,扩展性很强的系统。因为组件之间相互独立,也可以避免改一处而动全身的这样的风险。

LiteFlow只做基于逻辑的流转,而不做基于角色任务的流转。如果你想做基于角色任务的流转,推荐使用activiti。

我觉得吧,用处真不大,用责任链模式就很好,没必要引入这玩意。

14. 做功能要考虑多端

用户注册后的默认头像,本来想的是直接设置一个url在用户数据中。

但是这样没有考虑到多端,比如安卓、ios、小程序,可能会对头像有不同的处理,所以前端处理默认头像。

最后还是妥协了,由于前端用到的地方有点多,还是选择后端放一个默认的头像进去。

15. Md5Crypt md5加密盐

这个工具类,使用的时候要千万注意,如果你不指定salt,他那个会自动生成salt。导致每次加密出来的数据都不一样,哎,这么设计有个卵用。

16. salt的规则

11 标识符用来指示哈希值是使用 MD5 加盐算法计算的。这是为了与其他哈希算法(如 SHA-256, bcrypt 等)区分开来。

17. List.of()

List.of() 是 Java 9 引入的一个静态工厂方法,用于创建不可变的列表。这个方法可以接受一组元素作为参数,并返回包含这些元素的不可变列表。特点:

  1. 不可变性:由 List.of() 创建的列表是不可变的,不能修改(即不能添加、删除或修改元素)。试图修改会抛出 UnsupportedOperationException 异常。

  2. 不允许空值:列表中不允许有 null 元素。如果你尝试将 null 作为元素传入,会抛出 NullPointerException。

  3. 轻量级:返回的列表实现较为轻量级,适合用于创建小型的、固定的列表。

    List list = List.of("apple", "banana", "cherry");

18. PlantUML

一款idea插件,根据文字生成uml图,好处是可以将图也放到git上管理,缺点是需要学习规则。

19. mysql8条件索引

todo 真假难料,网上看到的,有时间了试试。

CREATE UNIQUE INDEX idx_unique_a
ON your_table_name (A)
WHERE is_deleted = 0;

20. 手机没电

uber打车,手机没电价格更高,真tm奸商。

但是说实话,挺佩服的,惊为天人,算法和人性是什么关系。

21. @NotBlank分组验证

一个po,新增和修改公用,通过分组来验证数据,甚6

but!没有指定分组的校验规则将不生效,也就是说用了这个破玩意,你的所有校验都要指定groups

// 入参
@Validated(AAAAAConstants.GroupPost.class) @RequestBody XXXXXXPO po 

// 加到对应的转换方法上
@NotBlank(groups = {ApiConstants.GroupPut.class}, message = "id不能为空")
@NotBlank(message = "xx名称不能为空", groups = {ApiConstants.GroupPost.class, ApiConstants.GroupPut.class})

22. git空目录为什么不提交

Git 只跟踪文件,不跟踪目录。在 Git 的设计中,目录是隐式的,只有当目录中有文件时,Git 才会包含该目录。如果目录是空的,Git 会忽略它。

if you want to提交,you can 在空目录中添加一个隐藏文件,通常命名为 .gitkeep,它的作用只是占位,让 Git 可以提交这个目录。

23. sql 中unsigned的用法

在 MySQL 中,UNSIGNED 用于定义数值类型字段,使其只能存储非负值,适合需要处理非负数的场景。常见用法包括:

  1. 整数类型:如 INT UNSIGNED,它的取值范围是 0 到 4,294,967,295,而普通的 INT 范围是 -2,147,483,648 到 2,147,483,647。
  2. 浮点数类型:如 FLOAT UNSIGNED,只能存储正数。

24. git小团队使用

人少,大家都在一个分支开发就行,多拉代码就冲突少,dev,qa合并到master后都要干掉,再做新功能就要从master拉。

人多再一人一个分支。适合的才是最好的。

25. 删除数据

根据id删除数据,删除之前要做校验,判断这个id是不是他的,更严谨。

26. @see

@see 是一种 Javadoc 标签,用于在 API 文档中提供对相关类、方法或字段的引用。它可以帮助用户更好地理解类的功能和如何与其他类交互。

apifox生成文档的时候支持了这个注解,例如枚举,会把里面的内容给解析出来,写到文档上,很方便。

@see XXXEnum#name()

27. jakarta.validation @Valid

@Valid 是 Jakarta Bean Validation API(之前是 Java Bean Validation,JSR 380)中的一个注解,主要用于在 Java 应用程序中执行对象的验证。它通常与其他验证注解(如 @NotNull、@Size、@Email 等)一起使用,帮助确保数据的完整性和有效性。

主要作用

  1. 验证对象:

  2. 嵌套验证:

  3. 与 Spring 集成:

@Validated呢?

  • @Validated 主要用于 Spring 的方法级验证,可以应用于类、方法或参数。它会触发 Spring 的验证机制,确保输入数据满足指定的约束条件。

  • 分组验证:与 @Valid 不同,@Validated 支持分组验证(通过 groups 属性)。这意味着你可以定义不同的验证组,用于在不同的上下文中验证同一个对象。例如,你可以在创建和更新操作时对同一对象使用不同的验证规则。

  • 使用场景:常用于 Spring MVC 控制器、服务层的方法参数等地方。

28. redis incr

INCR 是 Redis 提供的一个非常常用的命令,用于对指定的键进行整数的自增操作。这个命令能够将存储在 Redis 中的键对应的整数值增加一个指定的数值(默认为 1)。如果键不存在,INCR 会自动将其初始化为 0,并进行自增操作。

29. spring ApplicationEventPublisher

ApplicationEventPublisher 是 Spring 框架中的一个接口,提供了事件发布的机制。它允许你在 Spring 应用程序中发布自定义事件,从而实现松耦合的组件之间的通信。

30. redis 不存在就设置一个值,存在就然后+1,带过期时间

String script = "local count = redis.call('incr', KEYS[1]) " +
        "if count == 1 then " +
        "redis.call('expire', KEYS[1], ARGV[1]) " +
        "end " +
        "return count;";
怎么搞比较好?使用原子的lua脚本or两个命令
stringRedisTemplate.opsForValue().setIfAbsent(key, "0", seconds, TimeUnit.SECONDS);
stringRedisTemplate.opsForValue().increment(key, 1);

31. @EventListener和@TransactionalEventListener

特性

@EventListener

@TransactionalEventListener

事务控制

没有事务控制,事件立即处理

可以控制事件的处理时机,通常与事务状态绑定

事件处理时机

在事件发布时立即处理

根据 phase设置,可以选择在事务提交后或回滚后处理

phase 设置

可以通过 phase属性设置为

AFTER_COMMIT或 AFTER_ROLLBACK

事务一致性

不能保证与事务提交的一致性

确保事务提交成功后才处理事件,保证事件与事务的一致性

常见用途

用于处理与事务无关的事件,通常是独立的业务操作

用于处理需要事务保证一致性的事件,例如发送邮件、消息队列、外部系统调用等

32. optimize imports on the fly

idea开启这个选项后,代码import会自动导包,也会自动把用不到的包删除。

33. idea断点导致debug启动变慢