📄🦌🙌🐟🏖️
日志记录
Where there is a where there is a way
随机文章
按住 Shift 横向滚动
热门文章
按住 Shift 横向滚动
Git基础

Git基础

本文介绍了Git的基本命令和分支操作。基本命令包括:使用`git init`初始化仓库,`git status`查看状态,`git add`将文件添加至暂存区,`git rm --cached`删除暂存区文件,`git commit`提交至本地仓库,`git reflog`和`git log`查看版本信息,`git reset --hard`切换版本。分支操作方面,阐述了创建、切换、合并(merge和rebase两种方式)及删除分支的命令,并说明了分支冲突的产生原因及解决方法(手动编辑冲突区域)。最后,总结了分支开发原则:master作为生产分支,develop作为开发分支,feature用于并行开发新功能,hotfix用于线上修复bug,并给出了典型流程图示。

Git概述

Git概述

Git是一种免费开源的**分布式版本控制系统**,具有性能快、占地小、分支特性突出等优点,常用于备份、代码还原、协同开发和问题追溯。 版本控制方式分为**集中式**(如SVN,依赖中央服务器,服务器故障则无法工作)和**分布式**(如Git,每台电脑都存有完整版本历史,支持离线开发,更安全)。 Git工作流程包括:从远程仓库克隆代码到本地,检出分支进行修订,将代码添加至暂存区并提交到本地仓库,最后推送至远程仓库;同步时可通过拉取(pull)或抓取(fetch)操作。 安装Git需从官网下载,按步骤配置编辑器、默认分支名、行尾转换等选项。安装后需设置用户信息(用户名和邮箱),并可配置指令别名及解决中文乱码问题。

Optional类

Optional类

Java 8 引入的 `Optional` 容器类用于优雅避免 `NullPointerException`,表示值可能存在或不存在。创建方式推荐 `ofNullable`(允许空值),区别于强制非空的 `of` 和明确的 `empty`。取值推荐 `orElse`、`orElseGet`(延迟加载)或 `orElseThrow`,避免使用 `get`。判断用 `ifPresent` 替代 `isPresent+get`。转换使用 `map` 和 `flatMap`(避免嵌套),过滤用 `filter`。Java 9 新增 `ifPresentOrElse` 和 `stream` 方法。最佳实践:`Optional` 仅用于返回值,不作为字段或方法参数,且避免滥用。

Spring延迟加载

Spring延迟加载

Spring Boot默认饿汉式加载所有单例Bean,可能导致启动慢或资源浪费。延迟加载(Lazy Initialization)可在首次使用时才初始化Bean,通过全局配置(`spring.main.lazy-initialization=true`)或局部`@Lazy`注解(类、方法、注入点)实现。其原理是Spring创建代理对象,在第一次调用方法时触发真实Bean的创建。适合用于耗时初始化(如Elasticsearch、Kafka、机器学习模型)或非关键组件,但不建议对Controller、Service等核心Bean延迟,以免首个请求变慢。副作用包括首次调用延迟、错误暴露滞后及代理轻微开销。另外,`ObjectProvider`也可按需获取Bean。合理使用延迟加载能优化启动速度和资源利用。

SpringBoot时间格式化问题

SpringBoot时间格式化问题

### 摘要 SpringBoot 时间处理涉及 SpringMVC、Jackson 和 JDK 时间 API 三个组件,分别处理 GET 参数、JSON 解析和返回序列化。常用注解包括 `@DateTimeFormat`(SpringMVC 参数绑定)和 `@JsonFormat`(Jackson 序列化/反序列化)。企业推荐使用 JDK8 的 `LocalDateTime`,并统一格式为 `yyyy-MM-dd HH:mm:ss`,时区设为 GMT+8。全局配置可通过 `application.yml` 设置 Date 类型格式,或自定义 `JacksonConfig` 配置 `JavaTimeModule` 支持 LocalDateTime。常见坑包括返回时间戳、未配置 JavaTimeModule、时区错乱等。最终建议统一时间类型、格式、时区,并通过全局配置实现规范管理。

Java扩展知识

Java扩展知识

Java包含三大分支:JavaSE(标准版,基础,用于桌面及C/S架构)、JavaEE(企业版,用于Web和企业应用)、JavaME(微型版,用于嵌入式设备)。Java采用混合编译方式,将.java文件编译为.class字节码,在JVM虚拟机中运行,实现跨平台。JDK为开发工具包(含JRE),JRE为运行环境。JVM内存分为栈、堆、方法区、本地方法栈和寄存器(JDK8起方法区被元空间替代)。字符串常量池中直接赋值的字符串可复用,而new创建的新对象在堆中;字符串拼接在JDK8后由StringBuilder优化。继承中,子类通过虚方法表继承非private、非static、非final的父类方法。BigInteger将数值分段存储于int数组中,BigDecimal则将字符串转换为字节数组存储。这些机制共同支撑了Java的高效运行与平台无关性。

Spring开发中几种数据模型

Spring开发中几种数据模型

本文介绍了Java开发中常见的对象类型及其在分层架构中的作用。**PO**(持久化对象)与数据库表一一映射,用于ORM;**DTO**(数据传输对象)用于接口和服务间传输,避免暴露敏感字段;**VO**(视图对象)专门返回给前端展示,可聚合多表数据;**BO**(业务对象)封装业务逻辑,在Service层使用;**DAO**(数据访问对象)负责数据库CRUD操作;**POJO**是普通Java对象,上述所有对象本质都是POJO。典型流程为:Controller接收DTO并调用Service → Service处理BO并调用DAO → DAO返回PO与数据库交互。实际项目中可简化对象使用,根据复杂度选择。

SpringBean的生命周期

SpringBean的生命周期

Spring Bean的完整生命周期包括:BeanDefinition注册(可被BeanFactoryPostProcessor修改)→实例化→属性填充(依赖注入)→Aware回调→BeanPostProcessor前置处理→初始化(@PostConstruct→InitializingBean→init-method)→BeanPostProcessor后置处理(AOP代理在此创建)→放入单例池可用→容器关闭时销毁。关键扩展点包括BeanFactoryPostProcessor和BeanPostProcessor。

Spring异步线程

Spring异步线程

Spring 提供 `@EnableAsync` 和 `@Async` 实现异步方法。`@EnableAsync` 注册 `AsyncAnnotationBeanPostProcessor`,通过 AOP 为 `@Async` 方法创建代理,将调用提交到线程池。默认使用 `SimpleAsyncTaskExecutor`,它每次新建线程,不适合生产;应自定义 `ThreadPoolTaskExecutor` 并指定核心、最大线程数等参数。异步方法无返回值时异常不会抛给调用方;有返回值需返回 `Future`/`CompletableFuture`。Spring Boot 通过 `TaskExecutionAutoConfiguration` 自动配置,可在 `application.yml` 中设置线程池参数,默认 Bean 名称 `applicationTaskExecutor`。底层本质是 AOP 拦截 + 线程池执行。

Spring事务

Spring事务

Spring 事务是数据库 ACID 原则在 Spring 中的实现,通过 AOP 代理自动管理事务的开启、提交和回滚,避免手写 JDBC 模板代码。使用方式分两种:声明式事务(@Transactional)和编程式事务(TransactionTemplate/PlatformTransactionManager)。声明式事务基于 AOP,支持 7 种传播行为(如 REQUIRED、REQUIRES_NEW、NESTED)、4 种隔离级别、回滚规则(默认只回滚 RuntimeException)等。底层通过 TransactionInterceptor 拦截器、DataSourceTransactionManager 和 ThreadLocal 绑定 Connection 实现同一线程复用连接。事务失效常见原因包括:方法非 public、self 调用(未经过代理)、final/static 方法、异常被 try-catch 吞没、非 Spring 管理对象、多线程、数据库引擎不支持(如 MyISAM)。编程式事务可精确控制代码块级事务,适用于复杂场景。

© 2026 日志记录