📄🦌🙌🐟🏖️
日志记录
Where there is a where there is a way
随机文章
按住 Shift 横向滚动
热门文章
按住 Shift 横向滚动
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)。编程式事务可精确控制代码块级事务,适用于复杂场景。

搭建Maven本地仓库

搭建Maven本地仓库

本文介绍了Maven私服Nexus的安装、配置与使用方法。首先,下载解压Nexus后通过`nexus /run nexus`启动,默认访问地址为`http://localhost:8081`,登录账号为admin,密码保存在`admin.password`文件中。Nexus默认包含maven-central、maven-releases、maven-snapshots和maven-public四个Maven仓库,其中public为仓库组。需修改代理仓库地址为阿里云镜像,并允许匿名访问。在IDEA中,需配置`settings.xml`的servers和mirrors,并在pom.xml中定义distributionManagement以实现资源的上传与下载。此外,还介绍了Docker快速搭建方式:拉取`sonatype/nexus3`镜像,创建挂载目录并启动容器。通过WebUI可创建、分组及上传资源。

Maven进阶

Maven进阶

本文介绍了Maven在项目开发中的核心实践,包括分模块开发、聚合、继承、属性管理、版本命名、资源配置、跳过测试及外部jar包安装。分模块是将项目拆解为多个独立模块,通过pom文件管理依赖,便于团队协作。聚合通过父pom统一管理子模块,确保模块间依赖同步更新。继承将公共依赖版本在父工程中统一管理,子模块无需指定版本,避免版本冲突。属性用自定义标签存储版本号,便于统一维护。版本命名采用SNAPSHOT(快照)和RELEASE(发布)规范。资源配置允许在pom中定义配置值,通过过滤机制注入到yaml文件。跳过测试可通过IDE、maven命令或pom配置实现。外部jar包通过`mvn install:install-file`命令安装至本地仓库。拆分项目时需注意父模块采用BOM导入方式管理依赖,子模块继承父模块并显式启用打包插件,同时确保mapper文件能被扫描到。

© 2026 日志记录