一份不可多得的 Lombok 学习指南,2024年最新深入浅出MyBatis技术原理与实战

  • @Getter 注解

@Target({ElementType.FIELD, ElementType.TYPE})

@Retention(RetentionPolicy.SOURCE)

public @interface Getter {

// 若getter方法非public的话,可以设置可访问级别

lombok.AccessLevel value() default lombok.AccessLevel.PUBLIC;

AnyAnnotation[] onMethod() default {};

// 是否启用延迟初始化

boolean lazy() default false;

}

  • @Setter

@Target({ElementType.FIELD, ElementType.TYPE})

@Retention(RetentionPolicy.SOURCE)

public @interface Setter {

// 若setter方法非public的话,可以设置可访问级别

lombok.AccessLevel value() default lombok.AccessLevel.PUBLIC;

AnyAnnotation[] onMethod() default {};

AnyAnnotation[] onParam() default {};

}

使用示例:

@Getter

@Setter

public class GetterAndSetterDemo {

String firstName;

String lastName;

LocalDate dateOfBirth;

}

以上代码经过 Lombok 编译后,会生成如下代码:

public class GetterAndSetterDemo {

String firstName;

String lastName;

LocalDate dateOfBirth;

public GetterAndSetterDemo() {

}

// 省略其它setter和getter方法

public String getFirstName() {

return this.firstName;

}

public void setFirstName(String firstName) {

this.firstName = firstName;

}

}

  • Lazy Getter

@Getter 注解支持一个 lazy 属性,该属性默认为 false。当设置为 true 时,会启用延迟初始化,即当首次调用 getter 方法时才进行初始化。

示例:

public class LazyGetterDemo {

public static void main(String[] args) {

LazyGetterDemo m = new LazyGetterDemo();

System.out.println(“Main instance is created”);

m.getLazy();

}

@Getter

private final String notLazy = createValue(“not lazy”);

@Getter(lazy = true)

private final String lazy = createValue(“lazy”);

private String createValue(String name) {

System.out.println(“createValue(” + name + “)”);

return null;

}

}

以上代码经过 Lombok 编译后,会生成如下代码:

public class LazyGetterDemo {

private final String notLazy = this.createValue(“not lazy”);

private final AtomicReference lazy = new AtomicReference();

// 已省略部分代码

public String getNotLazy() {

return this.notLazy;

}

public String getLazy() {

Object value = this.lazy.get();

if (value == null) {

synchronized(this.lazy) {

value = this.lazy.get();

if (value == null) {

String actualValue = this.createValue(“lazy”);

value = actualValue == null ? this.lazy : actualValue;

this.lazy.set(value);

}

}

}

return (String)((String)(value == this.lazy ? null : value));

}

}

通过以上代码可知,调用 getLazy 方法时,若发现 value 为 null,则会在同步代码块中执行初始化操作。

3.2 Constructor Annotations


  • @NoArgsConstructor

使用 @NoArgsConstructor 注解可以为指定类,生成默认的构造函数,@NoArgsConstructor 注解的定义如下:

@Target(ElementType.TYPE)

@Retention(RetentionPolicy.SOURCE)

public @interface NoArgsConstructor {

// 若设置该属性,将会生成一个私有的构造函数且生成一个staticName指定的静态方法

String staticName() default “”;

AnyAnnotation[] onConstructor() default {};

// 设置生成构造函数的访问级别,默认是public

AccessLevel access() default lombok.AccessLevel.PUBLIC;

// 若设置为true,则初始化所有final的字段为0/null/false

boolean force() default false;

}

示例:

@NoArgsConstructor(staticName = “getInstance”)

public class NoArgsConstructorDemo {

private long id;

private String name;

private int age;

}

以上代码经过 Lombok 编译后,会生成如下代码:

public class NoArgsConstructorDemo {

private long id;

private String name;

private int age;

private NoArgsConstructorDemo() {

}

public static NoArgsConstructorDemo getInstance() {

return new NoArgsConstructorDemo();

}

}

  • @AllArgsConstructor

使用 @AllArgsConstructor 注解可以为指定类,生成包含所有成员的构造函数,@AllArgsConstructor 注解的定义如下:

@Target(ElementType.TYPE)

@Retention(RetentionPolicy.SOURCE)

public @interface AllArgsConstructor {

// 若设置该属性,将会生成一个私有的构造函数且生成一个staticName指定的静态方法

String staticName() default “”;

AnyAnnotation[] onConstructor() default {};

// 设置生成构造函数的访问级别,默认是public

AccessLevel access() default lombok.AccessLevel.PUBLIC;

}

示例:

@AllArgsConstructor

public class AllArgsConstructorDemo {

private long id;

private String name;

private int age;

}

以上代码经过 Lombok 编译后,会生成如下代码:

public class AllArgsConstructorDemo {

private long id;

private String name;

private int age;

public AllArgsConstructorDemo(long id, String name, int age) {

this.id = id;

this.name = name;

this.age = age;

}

}

  • @RequiredArgsConstructor

使用 @RequiredArgsConstructor 注解可以为指定类必需初始化的成员变量,如 final 成员变量,生成对应的构造函数,@RequiredArgsConstructor 注解的定义如下:

@Target(ElementType.TYPE)

@Retention(RetentionPolicy.SOURCE)

public @interface RequiredArgsConstructor {

// 若设置该属性,将会生成一个私有的构造函数且生成一个staticName指定的静态方法

String staticName() default “”;

AnyAnnotation[] onConstructor() default {};

// 设置生成构造函数的访问级别,默认是public

AccessLevel access() default lombok.AccessLevel.PUBLIC;

}

示例:

@RequiredArgsConstructor

public class RequiredArgsConstructorDemo {

private final long id;

private String name;

private int age;

}

以上代码经过 Lombok 编译后,会生成如下代码:

public class RequiredArgsConstructorDemo {

private final long id;

private String name;

private int age;

public RequiredArgsConstructorDemo(long id) {

this.id = id;

}

}

3.3 @EqualsAndHashCode


使用 @EqualsAndHashCode 注解可以为指定类生成 equals 和 hashCode 方法, @EqualsAndHashCode 注解的定义如下:

@Target(ElementType.TYPE)

@Retention(RetentionPolicy.SOURCE)

public @interface EqualsAndHashCode {

// 指定在生成的equals和hashCode方法中需要排除的字段列表

String[] exclude() default {};

// 显式列出用于identity的字段,一般情况下non-static,non-transient字段会被用于identity

String[] of() default {};

// 标识在执行字段计算前,是否调用父类的equals和hashCode方法

boolean callSuper() default false;

boolean doNotUseGetters() default false;

AnyAnnotation[] onParam() default {};

@Deprecated

@Retention(RetentionPolicy.SOURCE)

@Target({})

@interface AnyAnnotation {}

@Target(ElementType.FIELD)

@Retention(RetentionPolicy.SOURCE)

public @interface Exclude {}

@Target({ElementType.FIELD, ElementType.METHOD})

@Retention(RetentionPolicy.SOURCE)

public @interface Include {

String replaces() default “”;

}

}

示例:

@EqualsAndHashCode

public class EqualsAndHashCodeDemo {

String firstName;

String lastName;

LocalDate dateOfBirth;

}

以上代码经过 Lombok 编译后,会生成如下代码:

public class EqualsAndHashCodeDemo {

String firstName;

String lastName;

LocalDate dateOfBirth;

public EqualsAndHashCodeDemo() {

}

public boolean equals(Object o) {

if (o == this) {

return true;

} else if (!(o instanceof EqualsAndHashCodeDemo)) {

return false;

} else {

EqualsAndHashCodeDemo other = (EqualsAndHashCodeDemo)o;

if (!other.canEqual(this)) {

return false;

} else {

// 已省略大量代码

}

}

public int hashCode() {

int PRIME = true;

int result = 1;

Object $firstName = this.firstName;

int result = result * 59 + ($firstName == null ? 43 : $firstName.hashCode());

Object $lastName = this.lastName;

result = result * 59 + ($lastName == null ? 43 : $lastName.hashCode());

Object $dateOfBirth = this.dateOfBirth;

result = result * 59 + ($dateOfBirth == null ? 43 : $dateOfBirth.hashCode());

return result;

}

}

3.4 @ToString


使用 @ToString 注解可以为指定类生成 toString 方法, @ToString 注解的定义如下:

@Target(ElementType.TYPE)

@Retention(RetentionPolicy.SOURCE)

public @interface ToString {

// 打印输出时是否包含字段的名称

boolean includeFieldNames() default true;

// 列出打印输出时,需要排除的字段列表

String[] exclude() default {};

// 显式的列出需要打印输出的字段列表

String[] of() default {};

// 打印输出的结果中是否包含父类的toString方法的返回结果

boolean callSuper() default false;

boolean doNotUseGetters() default false;

boolean onlyExplicitlyIncluded() default false;

@Target(ElementType.FIELD)

@Retention(RetentionPolicy.SOURCE)

public @interface Exclude {}

@Target({ElementType.FIELD, ElementType.METHOD})

@Retention(RetentionPolicy.SOURCE)

public @interface Include {

int rank() default 0;

String name() default “”;

}

}

示例:

@ToString(exclude = {“dateOfBirth”})

public class ToStringDemo {

String firstName;

String lastName;

LocalDate dateOfBirth;

}

以上代码经过 Lombok 编译后,会生成如下代码:

public class ToStringDemo {

String firstName;

String lastName;

LocalDate dateOfBirth;

public ToStringDemo() {

}

public String toString() {

return “ToStringDemo(firstName=” + this.firstName + “, lastName=” +

this.lastName + “)”;

}

}

3.5 @Data


@Data 注解与同时使用以下的注解的效果是一样的:

@ToString

@Getter

@Setter

@RequiredArgsConstructor

@EqualsAndHashCode

@Data 注解的定义如下:

@Target(ElementType.TYPE)

@Retention(RetentionPolicy.SOURCE)

public @interface Data {

String staticConstructor() default “”;

}

示例:

@Data

public class DataDemo {

private Long id;

private String summary;

private String description;

}

以上代码经过 Lombok 编译后,会生成如下代码:

public class DataDemo {

private Long id;

private String summary;

private String description;

public DataDemo() {

}

// 省略summary和description成员属性的setter和getter方法

public Long getId() {

return this.id;

}

public void setId(Long id) {

this.id = id;

}

public boolean equals(Object o) {

if (o == this) {

return true;

} else if (!(o instanceof DataDemo)) {

return false;

} else {

DataDemo other = (DataDemo)o;

if (!other.canEqual(this)) {

return false;

} else {

// 已省略大量代码

}

}

}

protected boolean canEqual(Object other) {

return other instanceof DataDemo;

}

public int hashCode() {

int PRIME = true;

int result = 1;

Object $id = this.getId();

int result = result * 59 + ($id == null ? 43 : $id.hashCode());

Object $summary = this.getSummary();

result = result * 59 + ($summary == null ? 43 : $summary.hashCode());

Object $description = this.getDescription();

result = result * 59 + ($description == null ? 43 : $description.hashCode());

return result;

}

public String toString() {

return “DataDemo(id=” + this.getId() + “, summary=” + this.getSummary() + “, description=” + this.getDescription() + “)”;

}

}

3.6 @Log


若你将 @Log 的变体放在类上(适用于你所使用的日志记录系统的任何一种);之后,你将拥有一个静态的 final log 字段,然后你就可以使用该字段来输出日志。

@Log

private static final java.util.logging.Logger log = java.util.logging.Logger.getLogger(LogExample.class.getName());

@Log4j

private static final org.apache.log4j.Logger log = org.apache.log4j.Logger.getLogger(LogExample.class);

@Log4j2

private static final org.apache.logging.log4j.Logger log = org.apache.logging.log4j.LogManager.getLogger(LogExample.class);

@Slf4j

private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(LogExample.class);

@XSlf4j

private static final org.slf4j.ext.XLogger log = org.slf4j.ext.XLoggerFactory.getXLogger(LogExample.class);

@CommonsLog

private static final org.apache.commons.logging.Log log = org.apache.commons.logging.LogFactory.getLog(LogExample.class);

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
img

那么如何才能正确的掌握Redis呢?

为了让大家能够在Redis上能够加深,所以这次给大家准备了一些Redis的学习资料,还有一些大厂的面试题,包括以下这些面试题

  • 并发编程面试题汇总

  • JVM面试题汇总

  • Netty常被问到的那些面试题汇总

  • Tomcat面试题整理汇总

  • Mysql面试题汇总

  • Spring源码深度解析

  • Mybatis常见面试题汇总

  • Nginx那些面试题汇总

  • Zookeeper面试题汇总

  • RabbitMQ常见面试题汇总

JVM常频面试:

Redis高频面试笔记:基础+缓存雪崩+哨兵+集群+Reids场景设计

Mysql面试题汇总(一)

Redis高频面试笔记:基础+缓存雪崩+哨兵+集群+Reids场景设计

Mysql面试题汇总(二)

Redis高频面试笔记:基础+缓存雪崩+哨兵+集群+Reids场景设计

Redis常见面试题汇总(300+题)

Redis高频面试笔记:基础+缓存雪崩+哨兵+集群+Reids场景设计

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
img

-1712799144638)]
[外链图片转存中…(img-chn92Nww-1712799144639)]
[外链图片转存中…(img-mf9FZDee-1712799144639)]
[外链图片转存中…(img-ryFWunpG-1712799144640)]
[外链图片转存中…(img-oRN7Ik2j-1712799144640)]
[外链图片转存中…(img-noeGFmH3-1712799144640)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
[外链图片转存中…(img-ezAcRhlB-1712799144641)]

那么如何才能正确的掌握Redis呢?

为了让大家能够在Redis上能够加深,所以这次给大家准备了一些Redis的学习资料,还有一些大厂的面试题,包括以下这些面试题

  • 并发编程面试题汇总

  • JVM面试题汇总

  • Netty常被问到的那些面试题汇总

  • Tomcat面试题整理汇总

  • Mysql面试题汇总

  • Spring源码深度解析

  • Mybatis常见面试题汇总

  • Nginx那些面试题汇总

  • Zookeeper面试题汇总

  • RabbitMQ常见面试题汇总

JVM常频面试:

[外链图片转存中…(img-ju2J4v25-1712799144641)]

Mysql面试题汇总(一)

[外链图片转存中…(img-ZiQVBtzg-1712799144641)]

Mysql面试题汇总(二)

[外链图片转存中…(img-NXX8GG3Y-1712799144642)]

Redis常见面试题汇总(300+题)

[外链图片转存中…(img-PnQHjgUq-1712799144642)]

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[外链图片转存中…(img-Sf33dtjv-1712799144642)]

  • 30
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值