java抽象类可通过模板方法模式统一日志与异常处理:定义final模板方法封装执行全流程,抽象业务方法供子类实现,内置slf4j日志记录与分级异常捕获,并提供钩子方法支持定制化增强。

Java 中抽象类本身不能直接“实现”日志记录与异常捕获,但可以作为基类,通过模板方法、钩子方法和统一的异常处理机制,为子类提供可复用的日志与异常拦截能力。关键不是让抽象类“自动记录”,而是设计出子类必须遵循的执行契约。
在抽象类中定义统一执行模板
利用模板方法模式,在抽象类中定义核心流程(如 doExecute()),将具体业务逻辑留给子类实现,同时在模板中嵌入日志与异常处理。
- 声明一个 final 的模板方法,封装日志开始、执行、异常捕获、日志结束全过程
- 定义抽象方法供子类实现实际业务逻辑(如 executeInternal())
- 模板方法内使用 SLF4J 或 Logback 记录进入/退出/耗时,捕获所有 Throwable 并统一处理
统一异常处理与日志输出
在模板方法中 catch Exception 和 RuntimeException,避免子类遗漏异常处理;对不同异常类型做分级日志(ERROR / WARN),并可选择抛出包装异常或返回错误结果。
- 记录异常堆栈(logger.error("执行失败", e)),而非仅打印消息
- 区分业务异常(如 BusinessException)和系统异常(如 NullPointerException),前者可只记 WARN,后者记 ERROR
- 可附加上下文信息,如方法名、参数摘要(注意脱敏)、请求 ID 等
支持子类定制化日志行为
提供受保护的钩子方法(如 beforeLog()、afterLog()、onException()),允许子类在不破坏主流程的前提下增强日志内容或调整异常响应。
- 子类可重写 onException() 来添加告警、上报监控或转换异常类型
- 通过 protected 字段暴露 logger 实例,子类可直接调用,保持日志命名一致性(如用 getClass().getSimpleName() 作为 logger name)
- 支持传入 MDC(Mapped Diagnostic Context)键值,实现链路追踪日志染色
配合 Spring AOP 做补充(非必须但推荐)
抽象类聚焦于“主动执行”的业务方法(如 service 层的 command 模式),而 AOP 可覆盖更广场景(如 controller 入口、DAO 调用)。两者不冲突,可分层协作。
- 抽象类保障核心业务流程的健壮性;AOP 处理横切关注点(如接口级日志、全局异常处理器 @ControllerAdvice)
- 避免在抽象类里重复造轮子(如事务、权限),这些交给 Spring 管理更合适
- 若子类是 Spring Bean,可在抽象父类中注入 Logger 或 ApplicationEventPublisher,提升扩展性
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











