骏 伯 Junbo

使命:让移动互联网营销简单高效

价值观:创造价值,分享价值

愿景:做最受信赖的移动互联网营销服务商


蔡枫 的2023年终总结

  • 回顾2023,你印象最深刻的2-3个 高光时刻 是什么?

    1. 愿意去了解,理解新事物的时候,从电影和音乐等感受乐趣,共情与哲思

    2. 准备一年拿到奖学金,重修两门课程高分通过

    3. 通过面试,进入骏伯,一定多向同事们学习

  • 回顾2023,你印象最深刻的2-3个 艰难时刻 是什么?

    1. 放弃考研和出国,感觉是当下比较好的决定

    2. 想到家里情况是多么窘迫的时刻

    3. 发现脱发症状的时候

  • 目标A:准备就业

    大概是八月份,打消了考研以及留学的念头后,由于有Java开发的经验,自然往这个方向准备就业。
    要学习的内容特别多,原以为有基础便能用三个月左右准备好,事实上即使每天都在尽力填充自己,如此半年后还剩下许多没准备好的,更别说要能够在面试时从容对答。但是并不焦虑,只要做好规划,继续学下去,有限的内容总是能够准备完成的,剩下就是准备和面对不喜欢的面试环节。
    2024年1月4日,我通过了骏伯的面试,岗位是Java开发实习生。面试中,我提到希望接触一些高并发、分布式这样的复杂场景中的“高大上”的问题。进入公司两周,我了解到在实际工作中更多的是在不断地解决需求,跟团队成员协作对接,真正重要的是要有解决实际问题的能力。
    每次向导师提问的时候,他的分享毫无保留,各位同事都是我学习的对象。未来的日子,我将尽全力完成每个安排到的任务,提升编码能力,为公司创造价值。


01.10

  • 模块 服务?一个服务占用一个端口, 在 .gradle 配置
    {
    demo-api: 服务化接口定义项目
    demo-service: 服务化实现项目
    }
    api 接口与实现 分离,
    UserApi接口上加 @FeignClient, 请求均分发送到多台服务器上
    spring注入 与 单例模式。。

  • 敏捷开发:一种应对快速变化需求的一种软件开发能力。相对于”非敏捷”,更强调程序员团队与业务专家之间的紧密协作、面对面的沟通(认为比书面的文档更有效)、频繁交付新的软件版本、紧凑而自我组织型的团队、能够很好地适应需求变化的代码编写和团队组织方法,也更注重做为软件开发中人的作用。

01.18

  • 使用不同的窗口打开一个项目下的不同服务、、

  • 使用 IDEA -> Run/Debug Configuration -> Shorten command line 选项用于指定是否缩短命令行,以提高可读性或管理性,其中 None 表示不缩短,Classpath File 表示通过类路径文件缩短。
    Java 源代码被编译成字节码文件(.class 文件)。字节码文件在 Java 虚拟机(JVM)上运行。运行时配置参数通过命令行或配置文件传递给 JVM 和应用程序。运行时参数包括类路径、系统属性、环境变量、应用程序参数等,用于影响应用程序在运行时的行为。

  • DevOps 懂技术的运维? https://learn.lianglianglee.com/%E4%B8%93%E6%A0%8F/%E8%BD%AF%E4%BB%B6%E5%B7%A5%E7%A8%8B%E4%B9%8B%E7%BE%8E/36%20DevOps%E5%B7%A5%E7%A8%8B%E5%B8%88%E5%88%B0%E5%BA%95%E8%A6%81%E5%81%9A%E4%BB%80%E4%B9%88%E4%BA%8B%E6%83%85%EF%BC%9F.md
    DevOps 可以理解为一种开发和运维一起紧密协作的工作方式,从而可以更快更可靠地构建、测试和发布软件。DevOps 的主要原则就是自动化、信息透明可测量、构建协作文化。
    DevOps 工程师,要做的事情就是帮助团队来实践 DevOps 的工作方式。具体可以帮助团队:建立基于持续集成和持续交付工作流程;建立基于日志的监控报警的系统,以及故障响应的流程;构建基于云计算和虚拟化技术的基础设施;形成 DevOps 的文化。DevOps 工程师做的事情,就是帮助团队基于 DevOps 原则来做事,让团队形成紧密协作的工作方式,更快更可靠的构建、测试和发布软件。

01.23

  • Jedis 和 RedisTemplate有什么区别?
    Jedis 是 Redis 的官方 Java 客户端,直接使用 Redis 的命令进行操作。它提供了比较底层的 API,需要手动管理连接、序列化等。RedisTemplate 是 Spring Data Redis 提供的 Redis 客户端,它在 Jedis 的基础上进行了封装,提供了更高层次的抽象和更多的功能。
    如果你在使用 Spring 项目,并且希望更方便地集成 Redis,并提供更高层次的抽象和功能,那么推荐使用 RedisTemplate。如果你对 Redis 的命令较为了解,或者需要更底层的操作,那么 Jedis 可能更适合你。

  • SpringBoot实体类 DO 和 BO

    1. DO(Data Object):通常表示数据库中的数据实体,对应数据库表的结构。它主要用于数据存储和数据库操作,包含与数据库表字段一一对应的属性。DO 类的命名一般以 “DO” 为后缀,例如 UserDOOrderDO。类中通常包含与数据库表字段对应的成员变量、getter 和 setter 方法。它不应包含业务逻辑,主要负责数据的持久化和映射。
    2. BO(Business Object):通常表示业务层的业务实体,主要用于封装业务逻辑。BO 类一般包含与业务逻辑相关的属性和方法,与具体的数据存储形式无关。包含了一些业务逻辑的操作,比如计算、验证等。它不应直接与数据库进行交互,而是通过调用 Service 层或 DAO 层的方法实现数据的获取和存储。
    3. 在 Spring Boot 中,DO和 BO是一些常见的命名规范,用于表示在不同层次中使用的实体类。这些命名规范有助于代码的清晰性和可维护性。在业务逻辑层中,可以通过转换工具或框架进行 DO 和 BO 之间的转换,以完成数据的传递和处理。
      1
      2
      // 利用实例BO对象生成DO对象
      OrderDO orderDO = BeanMapperUtil.map(orderBO, OrderDO.class);
      1
      2
      3
      4
      5
      6
      7
      8
      9
      public static <T> T map(Object sourceObject, Class<T> destObjectclazz) {
      if (sourceObject == null) {
      return null;
      }
      T destObject = BeanUtils.instantiateClass(destObjectclazz);
      // 对象映射: 通过 copyProperties 方法,将源对象的属性值复制到目标对象中
      copyProperties(sourceObject, destObject, null, (String[]) null);
      return destObject;
      }

01.30

App拉新业务,增加白名单功能

02.20

需求:开发媒体上报规则报表的分页查询接口

02.22

  • YY yy = BeanMapperUtil.map(xx, YY.class); 从xx复制属性值而来生成YY类型的实例yy
  • List list = page.getList().stream().map(this::toResponse).collect(Collectors.toList());
    Java中的Stream API 是一种用于处理集合数据的强大工具,在 Java 8 中引入,它允许我们以声明性方式处理数据集合(即你可以描述你想要做什么,而不是描述如何去做),它使得集合操作更加简洁、易读和高效。
    • 创建 Stream:你可以从集合(如 List、Set 等)创建 Stream,或者从数组创建。
      1
      2
      3
      4
      List<String> list = Arrays.asList("a", "b", "c", "d");  
      Stream<String> stream = list.stream();
      // 或者直接从数组创建
      Stream<String> arrayStream = Arrays.stream(new String[]{"a", "b", "c", "d"});
    • 中间操作:是返回新 Stream 的操作,它们可以链接起来形成一个处理链。常见的中间操作有 filter、map、sorted 等。
      1
      2
      3
      4
      5
      6
      List<String> list = Arrays.asList("a", "b", "c", "d");  
      List<String> result = list.stream()
      .filter(s -> s.matches("[a-c]+")) // 过滤出以 a-c 开头的字符串
      .map(String::toUpperCase) // 将字符串转换为大写
      .sorted() // 对字符串进行排序
      .collect(Collectors.toList()); // 收集到新的 List 中
    • 终端操作:结束 Stream 处理并返回结果。常见的终端操作有 forEach、reduce、collect 等。
      1
      2
      3
      4
      5
      6
      7
      8
      9
      List<String> list = Arrays.asList("a", "b", "c", "d");  
      // 使用 forEach 遍历 Stream
      list.stream().forEach(System.out::println);
      // 使用 reduce 对 Stream 中的元素进行归约操作,例如求和
      int sum = list.stream().mapToInt(Integer::parseInt).sum();
      System.out.println(sum); // 输出:6('a'、'b'、'c'、'd' 的 ASCII 码之和)
      // 使用 collect 将 Stream 中的元素收集到新的集合中
      List<String> collectedList = list.stream().collect(Collectors.toList());
      System.out.println(collectedList); // 输出:[a, b, c, d]
    • 并行 Stream:Java Stream API 还支持并行处理,这可以充分利用多核处理器的优势,提高处理速度。要创建一个并行 Stream,你可以使用 parallelStream() 方法。
      1
      2
      3
      4
      List<String> list = Arrays.asList("a", "b", "c", "d");  
      // 使用 parallelStream 创建并行 Stream
      List<String> collectedList = list.parallelStream().collect(Collectors.toList());
      System.out.println(collectedList); // 输出:[a, b, c, d]
  • 在Java中,Stream流和序列化是两个不同的概念,但它们在某些场景下可以相互关联。
    • Stream流是Java 8引入的一个新特性,它允许我们以声明性方式处理数据集合。Stream API提供了一种高效且简洁的方式来处理数据,例如过滤、映射、排序和聚合等操作。Stream流主要关注的是数据的处理和转换,而不是数据的存储或传输。
    • 序列化(Serialization)则是将对象的状态转换为字节流的过程,以便可以将这些字节流持久化保存或通过网络传输到其他位置。序列化允许我们将对象的状态保存起来,然后在需要时恢复对象的状态。Java提供了ObjectOutputStream和ObjectInputStream类来进行对象的序列化和反序列化。
    • 虽然Stream流和序列化是两个不同的概念,但它们在某些情况下可以相互结合使用。例如,当我们需要将一个对象的状态通过网络传输到另一个位置时,我们可以先将对象序列化为字节流,然后使用Stream流来处理和转换这些字节流。在接收端,我们可以使用Stream流来读取字节流,并使用反序列化来恢复对象的状态。