Java阶段四Day04

news2024/11/27 16:40:49

Java阶段四Day04

文章目录

  • Java阶段四Day04
    • 关于SLF4j日志框架
    • 使用@Sql注解
    • 关于DAO架构
    • 关于Service
    • 关于异常

关于SLF4j日志框架

  • 在开发实践中,通常禁止使用System.out.println()这种语句输出信息,主要原因有:

    • 输出效率低下,特别是字符串与变量拼接时
    • 在开发过程中输出的某些信息,不适合在测试环境或生产环境中被显示
  • 在Spring Boot项目中,基础依赖项(spring-boot-starter)中已经包含了日志相关的依赖项,可以直接使用日志框架来输出信息

  • 在添加了Lombok后,在任何类的声明之前,添加@Slf4j注解,则编译期会自动声明一个名为log的变量,所以可以在类中通过此变量来输出日志

  • 如果没有使用Lombok,可以自行声明日志变量,例如:

private static Logger logger = LoggerFactory.getLogger(当前类的类名.class);
  • 日志级别分为:TRACEDEBUGINFOWARNERROR

  • 当配置包名时,不必把包名配置得特别具体,可以作用于其子孙包下所有的类,但是,必须至少配置1级包名,例如配置到com这一级包,不可以完全不配置包名,需要注意,当前项目中添加的所有依赖项,也是当前项目的一部分,不应该将包名配置得过于简单

  • 提示:Mybatis框架会生成各Mapper接口的对象,这些对象在执行SQL语句时,也会输出日志,是traceinfo级别的日志,当把日志的显示级别设置为较低的级别时,可以看到这些日志

  • 在调用日志的方法时,如果输出的信息中包含变量值,推荐使用
    trace(String message,Object… args)方法(其它级别也是同样参考方法),在String message参数中,可以使用{}作为占位符,表示此处是一个变量值,然后,通过Object. .. args依次传入各占位符对应的值

    int x = 1;
    int y = 2;
    System.out.println("x = " + x + ", y = " + y + ", x + y = " + (x + y));//传统做法
    log.info("x = {}, y = {},x+ y = {}", x , y , x + y);//使用日志输出变量的做法
    
  • SLF4j只是一个日志框架的标准,具体的日志相关功能并不是由它实现的,常见的实现了日志相关功能的日志框架有: log4jlogback等,SLF4j提供了这些日志框架向SLF4j标准的转换

使用@Sql注解

  • MyBatisPlus框架提供的注解,用于自定义SQL查询语句。使用@sql注解,可以直接在Mapper接口中定义SQL查询语句,避免编写大量的XML配置文件。一般来说,@sql注解比较适合一些简单的查询语句,不适合复杂、动态的查询。如果需要进行复杂的查询,建议使用MyBatisPlus提供的QueryWrapperLambdaQueryWrapper进行构建查询条件
  • 还可以在测试类.上使用@Sql注解,可以作用于此测试类中所有测试方法,但不一定合适。如果只是需要执行测试后,数据库中的数据不会发生变化,还可以在测试方法上,添加@Transactional注解,可以使得测试后自动回滚,表现为:测试方法对数据的修改不会被保存到数据库中,而真正想要提交的数据再添加@Commit

关于DAO架构

技术是会变化的,当下使用MyBaits / MyBaits Plus是 非常好的选择,以后可能就不是了,如果改为使用其它框架,原本Service调用MyBatis / MyBaits Plus的代码就需要跟随调整。为了更好的实现解耦,DAO层不应该对外直接暴露所使用的技术框架,则可以在ServiceMyBatis / MyBaits Plus接口之间加一层

在这里插入图片描述

接口和实现类的命名有两套规则:

  • 【强制】对于Service和DAO类,基于SOA的理念,暴露出来的服务-定是接口,内部的实现类用Impl的后缀与接口区别

    • 正例:CacheServiceImpl实现CacheService接口
  • 【推荐】如果是形容能力的接口名称,取对应的形容词做接口名(通常是-able的形式)

    • 正例:AbstractTranslator实现Translatable

关于Service

  • Service是项目中用于处理业务的组件,主要职责是:组织业务流程与业务逻辑,以保障数据的完整性、有效性、安全性
  • 安全性:数据会随着我们设定的规则而产生,或发生变化
  • 在项目中,专门划分出Service层的主要原因有:
    • 分工明确,因为ControllerDAO层均有明确的需要解决的问题,它们不应该关心业务流程与业务逻辑
    • Service中的代码应该与框架无关(除了最基础的框架以外,例如Spring),无论你的项目使用什么技术框架,数据处理规则应该是不变的,而ControllerDAO层都是基于某些框架的
  • 关于Service中的业务方法的声明原则:
    • 返回值类型:仅以操作成功为前提来设计返回值类型,如果视为操作失败,将通过抛出异常来表示
    • 方法名称:自定义
    • 参数列表:通常按照客户端或控制器(Controller) 会传递过来的参数来设计

关于异常

  • Service中使用抛出异常的方式来表示某种“失败”,在调用Service中的方法时,也会捕获对应的异常,来发现并处理这些“失败”
  • 如果抛出的异常是某种已经存在的异常类型,例如使用RuntimeException,在实际执行时,如果因为其它原因导致了RuntimeException,对于方法的调用者而言,将无法正确的区分,最终,捕获并处理时可能不准确
  • 为了解决此问题,在Service中抛出的异常必须是自定义异常
  • 自定义的异常需要继承自RuntimeException,主要原因有:
    • Spring MVC框架有统一处理异常的机制,所以,Service方法始终抛出异常(throw / throws) ,并不处理(不使用try…catch) ,Controller方法也始终抛出异常,则没有必要反复通过throws关键字声明抛出异常!如果继承的父级异常不是RuntimeException,必须在各Service方法、Controller方法都声明抛出异常
    • Spring JDBC处理事务时,只会根据RuntimeException执行回滚
  • 自定义的异常,应该包含带String message参数的构造方法,使得抛出异常时可以封装异常信息
    • 关于异常的描述文本,应该是“谁抛出,谁描述”的原则
  • 【强制】不允许任何魔法值(即未经定义的常量)直接出现在代码中

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/646952.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

A fight among three “三国”混战 | 经济学人20230520版社论双语精翻

《经济学人》2023年5月20日封面(社论)文章精翻:《全球支付系统的“三国”混战》(A fight among three) A fight among three “三国”混战 The fight over the future of global payments 全球支付的未来之争 Digital …

函数重载分析

函数重载 (Function Overload) 用同一个函数名定义不同的函数 当函数名和不同的参数搭配时函数的含义不同 函数重载至少满足下面的一个条件: 参数个数不同 参数类型不同 参数顺序不同 上面的两个函数可以构成重载函数吗? 当默认参数遇上函数重载会发…

分布式系统概念和设计——分布式多媒体系统

分布式系统概念和设计 分布式多媒体系统 QoS QoS(Quality of Service,服务质量)是一种网络管理和控制技术,可以对网络流量进行管理和调度,以确保网络对不同类型的数据流的传输可以提供适当的带宽、传输延迟、抖动和可…

《交通规划》——最短路分配方法

《交通规划》——最短路分配方法 说明:下面内容,将用python、networkx实现刘博航、杜胜品主编的《交通规划》P198页的例题,主要是实现最短路径分配方法。 1. 题目描述如下: 2. networkx构建网络 import networkx as nx import …

Spring6 面向切面(AOP)

文章目录 1、场景模拟1.1、声明接口1.2、创建实现类1.3、创建带日志功能的实现类1.4、隐藏问题 2、代理模式2.1、概念2.2、静态代理2.3、动态代理2.4、测试 3、AOP概念及相关术语3.1、概述3.2、相关术语①横切关注点②通知(增强)③切面④目标⑤代理⑥连接…

跨模态检索论文阅读:Dissecting Deep Metric Learning Losses for Image-Text Retrieval(GOAL)

Dissecting Deep Metric Learning Losses for Image-Text Retrieval 剖析图像文本检索中的深度度量学习损失 2022.10 视觉语义嵌入(VSE)是图像-文本检索中的一种流行的应用方法,它通过学习图像和语言模式之间的联合嵌入空间来保留语义的相似性…

2023.06.14 QT day3

用QT实现的简单文本编辑器 头文件widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QPushButton> #include <QTextEdit> #include <QFont> #include <QFontDialog> #include <QColor> #include <QColorDialo…

C语言符合类型之结构篇(结构指针)

结构相关知识总结 什么是结构&#xff1f;结构的声明与简单使用结构的初始化结构中成员变量的访问结构的初始化器结构数组结构数组的声明结构数组的成员标识 结构的嵌套结构指针结构作为参数在函数中传递将结构成员作为参数进行传递将结构地址(指向结构的指针)作为参数进行传递…

leetcode 279.完全平方数

题目描述 给你一个整数 n &#xff0c;返回 和为 n 的完全平方数的最少数量 。 完全平方数 是一个整数&#xff0c;其值等于另一个整数的平方&#xff1b;换句话说&#xff0c;其值等于一个整数自乘的积。例如&#xff0c;1、4、9 和 16 都是完全平方数&#xff0c;而 3 和 11 …

cmu db p4

在lab4中实现一个基于 2PL 的并发控制方式&#xff0c;自动为并发事务执行加锁解锁&#xff0c;提供可串行化能力并实现可重复读、读已提交、读未提交三种隔离度 Lock Manager&#xff1a;锁管理器&#xff0c;利用 2PL 实现并发控制。支持 REPEATABLE_READ、READ_COMMITTED 和…

我五年经验,面试官: “不,你是把一年的工作经验用了五年”

最近看到很多软件测试由于公司裁员而需要重新求职的。他们普遍具有4年甚至更长的工作经验。但求职结果往往都不太理想。 我在与部分软件测试求职者交谈的过程中发现&#xff0c;很多人的工作思路不清晰&#xff0c;技能不扎实&#xff0c;没有持续学习的习惯&#xff0c;但对于…

编程(41) ----------线程池

本篇主要提及线程池的相关内容. 依旧是从最基础的含义开始. 什么是线程池? 在计算机中池的是一个很大的概念, 分为很多种. 但无论是什么池, 其核心都是存取相关数据. 线程池也不例外, 即存放线程的池. 其存在意义与线程异曲同工. 线程产生并使用是因为进程太"重"了…

Andriod开发 ViewPager PageTabStrip

1. ViewPager ViewPager常见于APP的引导页或者产品介绍&#xff0c;左右滑动展示不同页面。 ViewPager用PagerAdapter来绑定数据。PagerAdapter是个抽象类&#xff0c;所以需要写一个子类来实现它。 xml: <?xml version"1.0" encoding"utf-8"?> …

设计模式(十五):行为型之命令模式

设计模式系列文章 设计模式(一)&#xff1a;创建型之单例模式 设计模式(二、三)&#xff1a;创建型之工厂方法和抽象工厂模式 设计模式(四)&#xff1a;创建型之原型模式 设计模式(五)&#xff1a;创建型之建造者模式 设计模式(六)&#xff1a;结构型之代理模式 设计模式…

I2C与I3C

Improved Inter Integrated Circuit &#xff0c;是 MIPI&#xff08;Mobile Industry Processor Interface&#xff09;移动产业处理器接口联盟推出的改进型 i2c (Inter-Integrated Circuit Bus)总线接口。 I3C Introduction I3C &#xff1a;Improved Inter Integrated Cir…

CoreDX DDS应用开发指南(10)通信状态Communication Status

13 Communication Status通信状态 DDS基础设施跟踪与数据通信相关的许多状态和统计信息。应用程序可以选择了解这些状态和统计信息中的一些、全部或全部。 每个DDS实体都有其相关状态,如表13-1所示。 一些通信状态与可用于订阅应用程序的数据相关联。这些被称为读取…

Python发展5大方向,5个对应例子让你更清晰的认知Python!

目录 前言1.数据分析相关路线&#xff1a;案例&#xff1a;使用Python进行股票数据分析 2.人工智能学习路线&#xff1a;案例&#xff1a;使用Python进行图像识别 3.Web开发学习路线&#xff1a;案例&#xff1a;使用Python和Django开发博客网站 4.科学计算学习路线&#xff1a…

(小甲鱼python)类和对象(III)总结 类的继承---构造函数、重写、钻石继承、super()函数

一、基础复习 1.类和对象&#xff08;I&#xff09;总结 类的定义、self的用法 2.类的继承(II)、类的判断isinstance()、issubclass()、多重继承、类的组合 3.类和对象&#xff08;III&#xff09;总结 类的绑定&#xff0c;self&#xff0c;__dict__的妙用 二、类的继承 1.…

4.4.2 译码器

1. 学习基础知识&#xff1a;首先&#xff0c;我会了解译码器的基本概念、原理和应用。通过阅读教科书、参考资料或在线资源&#xff0c;我会学习译码器的工作原理、不同类型的译码器以及它们在电子系统中的应用场景。 2. 研究示例和练习题&#xff1a;为了更好地理解译码器的…

12、Nginx高级之高级模块(secure_link/secure_link_md5)

一、功能 防盗链&#xff1b; ngx_http_secure_link_module模块用于检查所请求链接的真实性&#xff0c;保护资源免受未经授权的访问&#xff0c;并限制链接寿命。 该模块提供两种可选的操作模式。 第一种模式由 secure_link_secret 指令启用&#xff0c;用于检查所请求链接的真…