Lombok注解式简化开发

news2024/12/25 23:10:19

Lombok(发音为"lombók")是一种Java库,它通过注解的方式来简化Java代码的编写。它提供了一组注解,用于在编译时生成代码,减少了开发人员需要手动编写的样板代码,提高了代码的简洁性和可读性。

Lombok 主要用于减少Java代码中的冗余,例如,通过添加 @Getter@Setter 注解,可以自动生成类的 getter 和 setter 方法,而无需手动编写这些方法。除此之外,Lombok 还提供了其他注解,如 @ToString@EqualsAndHashCode@NoArgsConstructor 等,用于生成相应的代码。

使用 Lombok 可以让开发人员更专注于业务逻辑的实现,而不必过多地关注类的样板代码。它在许多Java项目中得到广泛应用,特别是在Spring等框架中。

依赖

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>

常用注解

  1. @Getter:为属性生成 getter 方法。
  2. @Setter:为属性生成 setter 方法。
  3. @ToString:生成 toString() 方法。
  4. @EqualsAndHashCode:生成 equals()hashCode() 方法。
  5. @NoArgsConstructor:生成无参构造方法。
  6. @AllArgsConstructor:生成全参构造方法。
  7. @Data:结合 @Getter@Setter@ToString@EqualsAndHashCode@NoArgsConstructor 的组合注解。
  8. @Builder:为类提供一个 builder 模式。
  9. @Slf4j:为类提供一个 SLF4J 日志对象。
  10. @NonNull:在参数上使用,生成一个非空检查。
  11. @Cleanup:在局部变量上使用,自动关闭资源。

日志

@Slf4j 是 Lombok 中的一个注解,它会自动生成一个名为 log 的日志对象,用于在程序中输出日志信息。

具体来说,@Slf4j 注解可以用于任何类上,包括普通类、接口、枚举等,它会在编译时自动生成一个名为 log 的日志对象,用于在程序中输出日志信息。使用 @Slf4j 注解,您可以通过以下方式使用日志对象:

log.debug("Debug log message");
log.info("Info log message");
log.warn("Warning log message");
log.error("Error log message");

在上述代码中,log 对象是通过 @Slf4j 注解自动生成的,您可以使用它来输出日志信息。在运行时,Lombok 会生成一个包含 log 对象的静态字段,其类型是根据类名自动生成的。

需要注意的是,使用 @Slf4j 注解前,需要在项目中引入 Lombok 的依赖。

   @Slf4j
   public class LogExample {
   }
   
will generate:
   public class LogExample {
       private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(LogExample.class);
   }

配置文件

appender

追加器,指定日志如何输出

<!-- 系统日志输出info级别 -->
	<appender name="file_info" class="ch.qos.logback.core.rolling.RollingFileAppender">
	    <file>${log.path}/sys-info.log</file>
        <!-- 循环政策:基于时间创建日志文件 -->
		<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 日志文件名格式 -->
			<fileNamePattern>${log.path}/sys-info.%d{yyyy-MM-dd}.log</fileNamePattern>
			<!-- 日志最大的历史 60天 -->
			<maxHistory>60</maxHistory>
		</rollingPolicy>
		<encoder>
			<pattern>${log.pattern}</pattern>
		</encoder>
		<filter class="ch.qos.logback.classic.filter.LevelFilter">
            <!-- 过滤的级别 -->
            <level>INFO</level>
            <!-- 匹配时的操作:接收(记录) -->
            <onMatch>ACCEPT</onMatch>
            <!-- 不匹配时的操作:拒绝(不记录) -->
            <onMismatch>DENY</onMismatch>
        </filter>
	</appender>

name随便写,class指定日志输出到哪里:RollingFileAppender日志输出到文件并滚动,滚动记录文件,先将日志记录到指定文件,当符合某个条件时,将日志记录到其他文件,这个是最常用的;ConsoleAppender日志输出到控制台

<file>说明输出的文件位置和文件名

<rollingPolicy>滚动策略

<root>

根日志(Root Logger)是日志系统的最顶层的日志记录器。它是整个日志系统的入口,所有的日志事件都会首先传递给根日志,然后根据配置的日志级别和附加器(Appender)的设置进行相应的处理。

<logger>

<logger> 标签用于配置特定包的日志级别和附加器。在Logback中,每个 <logger> 元素允许你配置日志系统中的特定组件的日志行为。

<logger name="com.example.MyClass" level="DEBUG">
    <appender-ref ref="file" />
</logger>

name指定com.example.MyClass这个类的日志级别为debug,日志级别大于等于debug的都用file这个appender处理。

这个配置的含义是:

  • name 属性指定了要配置的包或类的名称(例如 com.example.MyClass)。
  • level 属性指定了这个包或类的日志级别(例如 DEBUG)。
  • <appender-ref> 元素允许你指定用于处理这个包或类日志事件的附加器(Appender)。

这样,可以对系统的不同部分配置不同的日志级别和输出方式,使得日志系统更加灵活和可控。

总配置

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <!-- 引入spirng boot默认的logback配置文件 -->
    <include resource="org/springframework/boot/logging/logback/defaults.xml"/>

    <!-- 日志存放路径 -->
	<property name="log.path" value="./logs" />
    <!-- 日志输出格式 -->
	<property name="log.pattern" value="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{20} - [%method,%line] - %msg%n" />

	<!-- 控制台输出 -->
	<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
		<encoder>
<!--			<pattern>${log.pattern}</pattern>-->
            <pattern>${CONSOLE_LOG_PATTERN}</pattern>
		</encoder>
	</appender>
	
	<!-- 系统日志输出info级别 -->
	<appender name="file_info" class="ch.qos.logback.core.rolling.RollingFileAppender">
	    <file>${log.path}/sys-info.log</file>
        <!-- 循环政策:基于时间创建日志文件 -->
		<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 日志文件名格式 -->
			<fileNamePattern>${log.path}/sys-info.%d{yyyy-MM-dd}.log</fileNamePattern>
			<!-- 日志最大的历史 60天 -->
			<maxHistory>60</maxHistory>
		</rollingPolicy>
		<encoder>
			<pattern>${log.pattern}</pattern>
		</encoder>
		<filter class="ch.qos.logback.classic.filter.LevelFilter">
            <!-- 过滤的级别 -->
            <level>INFO</level>
            <!-- 匹配时的操作:接收(记录) -->
            <onMatch>ACCEPT</onMatch>
            <!-- 不匹配时的操作:拒绝(不记录) -->
            <onMismatch>DENY</onMismatch>
        </filter>
	</appender>

    <!-- 系统日志输出error级别 -->
	<appender name="file_error" class="ch.qos.logback.core.rolling.RollingFileAppender">
	    <file>${log.path}/sys-error.log</file>
        <!-- 循环政策:基于时间创建日志文件 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 日志文件名格式 -->
            <fileNamePattern>${log.path}/sys-error.%d{yyyy-MM-dd}.log</fileNamePattern>
			<!-- 日志最大的历史 60天 -->
			<maxHistory>60</maxHistory>
        </rollingPolicy>
        <encoder>
            <pattern>${log.pattern}</pattern>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <!-- 过滤的级别 -->
            <level>ERROR</level>
			<!-- 匹配时的操作:接收(记录) -->
            <onMatch>ACCEPT</onMatch>
			<!-- 不匹配时的操作:拒绝(不记录) -->
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>
	
	<!-- 用户访问日志输出  -->
    <appender name="sys-user" class="ch.qos.logback.core.rolling.RollingFileAppender">
		<file>${log.path}/sys-user.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 按天回滚 daily -->
            <fileNamePattern>${log.path}/sys-user.%d{yyyy-MM-dd}.log</fileNamePattern>
            <!-- 日志最大的历史 60天 -->
            <maxHistory>60</maxHistory>
        </rollingPolicy>
        <encoder>
            <pattern>${log.pattern}</pattern>
        </encoder>
    </appender>
	
	<!-- 系统模块日志级别控制  -->
	<logger name="com.lin" level="info" />
	<!-- Spring日志级别控制  -->
	<logger name="org.springframework" level="warn" />

    <!--系统大于等于info级别的日志输出到控制台-->
	<root level="info">
		<appender-ref ref="console" />
	</root>
	
	<!--系统大于等于info级别的日志:如果是info使用file_info处理,如果是error使用file_error处理-->
    <root level="info">
        <appender-ref ref="file_info" />
        <appender-ref ref="file_error" />
    </root>
	
	<!--sys-user类或包下的info级别日志使用sys-user处理-->
    <logger name="sys-user" level="info">
        <appender-ref ref="sys-user"/>
    </logger>
</configuration> 

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

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

相关文章

【三种加载自定义控制器的方式 Objective-C语言】

一、关于这个手动创建Window呢,给大家说完了 1.但是呢,要给大家补充一个东西, 有时候,有的框架,可能会用到什么东西呢,我写到下面: [UIApplication sharedApplication] 什么东西,是不是应用程序对象, 然后呢,keyWindow 是不是拿到它的主窗口, 然后呢,add什么东西…

2013年12月2日 Go生态洞察:Go 1.2的测试覆盖率工具

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

Find My自行车|苹果Find My技术与自行车结合,智能防丢,全球定位

自行车&#xff0c;这项古老而简单的交通工具&#xff0c;近年来在中国经历了一场令人瞩目的复兴。从城市的街头巷尾到乡村的田园小路&#xff0c;自行车成了一种新的生活方式&#xff0c;一个绿色出行的选择。中国的自行车保有量超过两亿辆&#xff0c;但是自行车丢失事件还是…

java算法学习索引之数组矩阵问题

一 将正方形矩阵顺时针转动90 给定一个NN的矩阵matrix&#xff0c;把这个矩阵调整成顺时针转动90后的形式。 顺时针转动90后为&#xff1a; 【要求】额外空间复杂度为O&#xff08;1&#xff09;。 public void rotate(int[][] matrix) {int tR 0; // 左上角行坐标int tC 0;…

2023年中国AI大模型行业发展趋势分析:未来发展将走向通用化和专用化并行[图]

AI大模型是AI预训练大模型的简称&#xff0c;通过在大规模数据上进行预训练&#xff0c;无需大量微调即可支持各种应用&#xff0c;具备多层神经网络结构、高级优化算法和强大计算资源&#xff0c;显著提升了AI的通用性和实用性。 AI大模型特点及意义 资料来源&#xff1a;共研…

Java引用类型(String)

目录 String解析 final的作用 String是否有长度限制 StringBuffer解析 StringBuilder解析 关键字、操作类相关 引用数据类型非常多大致包括&#xff1a;类、 接口类型、 数组类型、 枚举类型、 注解类型、 字符串型。String类型就是引用类型。 String解析 JVM运行时会分…

姿态估计 手势动作实时识别项目(基于mediapipe、keras进行实现)

姿态估计 手势动作实时识别项目(基于mediapipe、keras进行实现) 0、功能展示1、项目原理介绍2、数据集采集脚本3、将采集到的动作数据集利用mediapipe库检测手部关键点信息,转换成数据信息保存到本地4、训练一个效果一般的随机森林分类器5、使用Kreas训练一个效果好点的全连…

linux内核管理

linux内核会占用一定的空间&#xff0c;所以可以清理一下不需要使用的内核. 参考链接 Linux 内核及其关联文件通常存储在 /boot 目录下&#xff0c;内核模块通常存储在 /lib/modules 目录中。 首先查看已安装的列表&#xff1a; dpkg --list | grep linux-image其中&#xff…

Hfish安全蜜罐部署

一、Hfish蜜罐介绍 HFish蜜罐官网 HFish是一款社区型免费蜜罐&#xff0c;侧重企业安全场景&#xff0c;从内网失陷检测、外网威胁感知、威胁情报生产三个场景出发&#xff0c;为用户提供可独立操作且实用的功能&#xff0c;通过安全、敏捷、可靠的中低交互蜜罐增加用户在失陷…

python实战—核心基础4(超市购物小票随机抽奖程序) lv1

目录 一、核心代码解释 二、代码 三、运行截图 一、核心代码解释 1、random() 函数 描述 random() 方法返回随机生成的一个实数&#xff0c;它在[0,1)范围内。 语法 以下是 random() 方法的语法: import randomrandom.random() 注意&#xff1a;random()是不能直接访问…

肉豆蔻酰六肽-16——让皮肤更加光滑、更加柔软

肉豆蔻酰六肽-16 一种合成的脂肪酸连接肽&#xff0c;已知可提高皮肤的弹性&#xff0c;明显镇静&#xff0c;并帮助皮肤看起来和感觉更光滑、更柔软。它是由肉豆蔻酸与六肽 16 结合而成。肉豆蔻酰六肽 16 被归类为蛋白质刺激肽&#xff0c;这意味着它可以帮助皮肤表面&#x…

抽象轻松测试接口API

测试 1.测试环境 2.测试代码 3.代码结构 Maven项目核心依赖 <dependency><groupId>com.github.xiaoymin</groupId><artifactId>knife4j-openapi3-jakarta-spring-boot-starter</artifactId><version>4.3.0</version></dependenc…

2023年中国涂料用环氧树脂需求量及行业市场规模前景分析[图]

环氧树脂具有力学性能高&#xff0c;内聚力强、分子结构致密&#xff0c;粘接性能优异&#xff0c;固化收缩率小&#xff08;产品尺寸稳定、内应力小、不易开裂&#xff09;&#xff0c;绝缘性、防腐性、稳定性、耐热性好&#xff08;可达200℃或更高&#xff09;等特点&#x…

解锁无限可能性:探索Amazon Lightsail的便捷云计算服务

解锁无限可能性&#xff1a;探索Amazon Lightsail的便捷云计算服务 在数字化时代&#xff0c;云计算成为推动创新和业务发展的关键驱动力。Amazon Lightsail 作为 Amazon Web Services&#xff08;亚马逊云科技&#xff09;家族中的一员&#xff0c;为小型企业和创业公司提供了…

共谋发展,共赢未来 | 江西航天红源农业科技总经理孟凡明一行莅临拓世科技集团考察参观

在时刻充满着变化与机遇的商业世界里&#xff0c;农业的颠覆与重构已成为产业新风口&#xff0c;在日新月异的当下&#xff0c;农业与乡村正被开辟成为推动产业结构升级的新战场。 2023年11月20日江西航天红源农业科技有限公司总经理孟凡明一行抵达拓世科技集团南昌总部进行考…

【鸿蒙应用ArkTS开发系列】- 灌水区,鸿蒙ArkTs开发有问题可以在该帖中反馈

大家好, 这是一篇水贴&#xff0c;给大家提供一个交流沟通鸿蒙开发遇到问题的地方。 新增新增这个文章呢&#xff0c;大家在开发使用ArkTS开发鸿蒙应用或者鸿蒙服务的时候&#xff0c;有遇到疑问或者问题&#xff0c;可以在本文章评论区提问&#xff0c;我看到了如果知道怎么…

基于SSM的学生档案管理系统设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

SpingBoot原理

目录 配置优先级Bean管理 (掌握)Bean的获取 ApplicationContext.getBeanBean的作用域 Scope("prototype") Lazy第三方Bean Bean Configuration SpringBoot底层原理 起步依赖与自动配置(无需手撸但面试高频知识点)自动配置引入第三方依赖常见方案方案1&#xff1a;Com…

python实战—数据分析与图表1(QQ群聊天数据分析) lv2

目录 一、核心代码解释 二、代码 三、运行截图 一、核心代码解释 1、readlines() 方法 描述 readlines() 方法用于读取所有行(直到结束符 EOF)并返回列表&#xff0c;该列表可以由 Python 的 for... in ... 结构进行处理。 如果碰到结束符 EOF 则返回空字符串。 语法 r…

HINSTANCE是什么?

HINSTANCE 就是 HMODULE&#xff1a;