七、Lombok注解详解(5)

12,@log

(1)该注解用在类上,可以省去从日志工厂生成日志对象这一步,直接进行日志记录,具体注解根据日志工具的不同而不同。不同的日志注解总结如下(上面是注解,下面是实际作用):
我们也可以在注解中使用 topic 来指定生成 log 对象时的类名。
 1 @CommonsLog
2 private static final org.apache.commons.logging.Log log =
3 org.apache.commons.logging.LogFactory.getLog(LogExample.class);
4
5 @JBossLog
6 private static final org.jboss.logging.Logger log =
7 org.jboss.logging.Logger.getLogger(LogExample.class);
8
9 @Log
10 private static final java.util.logging.Logger log =
11 java.util.logging.Logger.getLogger(LogExample.class.getName());
12
13 @Log4j
14 private static final org.apache.log4j.Logger log =
15 org.apache.log4j.Logger.getLogger(LogExample.class);
16
17 @Log4j2
18 private static final org.apache.logging.log4j.Logger log =
19 org.apache.logging.log4j.LogManager.getLogger(LogExample.class);
20
21 @Slf4j
22 private static final org.slf4j.Logger log =
23 org.slf4j.LoggerFactory.getLogger(LogExample.class);
24
25 @XSlf4j
26 private static final org.slf4j.ext.XLogger log =
27 org.slf4j.ext.XLoggerFactory.getXLogger(LogExample.class);
(2)下面是一个简单的使用样例:
 1 // 使用注解
2 @Log
3 public class LogExample {
4 public static void main(String... args) {
5 log.error("Something's wrong here");
6 }
7 }
8
9 // 不使用注解
10 public class LogExample {
11 private static final java.util.logging.Logger log =
12 java.util.logging.Logger.getLogger(LogExample.class.getName());
13
14 public static void main(String... args) {
15 log.error("Something's wrong here");
16 }
17 }

13,@Buinder

(1)builder 是现在比较推崇的一种构建值对象的方式。该描述符用于将类改造成 builder(建造者)模式,用在类、方法或者构造函数上。
 1 package com.example.demo;
2
3 import lombok.Builder;
4 import lombok.Singular;
5
6 import java.util.Set;
7
8 @Builder
9 public class BuilderExample {
10 private String name;
11 private int age;
12 @Singular
13 private Set<String> occupations;
14 }

(2)上面相当于如下传统的 Java 代码:

 1 package com.example.demo;
2
3 import java.util.Collection;
4 import java.util.Set;
5
6 public class BuilderExample {
7 private String name;
8 private int age;
9 private Set<String> occupations;
10
11 BuilderExample(String name, int age, Set<String> occupations) {
12 this.name = name;
13 this.age = age;
14 this.occupations = occupations;
15 }
16
17 public static BuilderExampleBuilder builder() {
18 return new BuilderExampleBuilder();
19 }
20
21 public static class BuilderExampleBuilder {
22 private String name;
23 private int age;
24 private java.util.ArrayList<String> occupations;
25
26 BuilderExampleBuilder() {
27 }
28
29 public BuilderExampleBuilder name(String name) {
30 this.name = name;
31 return this;
32 }
33
34 public BuilderExampleBuilder age(int age) {
35 this.age = age;
36 return this;
37 }
38
39 public BuilderExampleBuilder occupation(String occupation) {
40 if (this.occupations == null) {
41 this.occupations = new java.util.ArrayList<String>();
42 }
43
44 this.occupations.add(occupation);
45 return this;
46 }
47
48 public BuilderExampleBuilder occupations(Collection<? extends String> occupations) {
49 if (this.occupations == null) {
50 this.occupations = new java.util.ArrayList<String>();
51 }
52
53 this.occupations.addAll(occupations);
54 return this;
55 }
56
57 public BuilderExampleBuilder clearOccupations() {
58 if (this.occupations != null) {
59 this.occupations.clear();
60 }
61
62 return this;
63 }
64
65 public BuilderExample build() {
66 //complicated switch statement to produce a compact properly sized immutable set omitted
67 // go to https://projectlombok.org/features/Singular-snippet.html to see it.
68 Set<String> occupations = ...;
69 return new BuilderExample(name, age, occupations);
70 }
71
72 @java.lang.Override
73 public String toString() {
74 return "BuilderExample.BuilderExampleBuilder(name = " + this.name + ", age = "
75 + this.age + ", occupations = " + this.occupations + ")";
76 }
77 }
78 }

(3)下面是一个简单的测试样例:

1 BuilderExample be = BuilderExample.builder()
2 .name("hangge")
3 .age(123)
4 .occupation("ABC")
5 .occupation("DEF")
6 .build();
7
8 return be.toString();

14,@SneakyThrows

(1)该注解用在方法上,可以将方法中的代码用 try-catch 语句包裹起来,捕获异常并在 catch 中用 Lombok.sneakyThrow(e) 把异常抛出。
(2)也可以使用 @SneakyThrows(Exception.class) 的形式指定抛出哪种异常。
 1 // 使用注解
2 public class SneakyThrows implements Runnable {
3 @SneakyThrows(UnsupportedEncodingException.class)
4 public String utf8ToString(byte[] bytes) {
5 return new String(bytes, "UTF-8");
6 }
7
8 @SneakyThrows
9 public void run() {
10 throw new Throwable();
11 }
12 }
13
14 // 不使用注解
15 public class SneakyThrows implements Runnable {
16 public String utf8ToString(byte[] bytes) {
17 try{
18 return new String(bytes, "UTF-8");
19 }catch(UnsupportedEncodingException uee){
20 throw Lombok.sneakyThrow(uee);
21 }
22 }
23
24 public void run() {
25 try{
26 throw new Throwable();
27 }catch(Throwable t){
28 throw Lombok.sneakyThrow(t);
29 }
30 }
31 }

15,@Synchronized

该注解用在类方法或者实例方法上,效果和 synchronized 关键字相同,区别在于锁对象不同。对于类方法和实例方法,它俩区别在于:

  • synchronized 关键字的锁对象分别是“类的 class 对象”和“this 对象”
  • @Synchronized 的锁对象分别是“私有静态 final 对象 lock”和“私有 final 对象 lock”。当然,也可以自己指定锁对象。
 1 // 使用注解
2 public class Synchronized {
3 private final Object readLock = new Object();
4
5 @Synchronized
6 public static void hello() {
7 System.out.println("world");
8 }
9
10 @Synchronized
11 public int answerToLife() {
12 return 42;
13 }
14
15 @Synchronized("readLock")
16 public void foo() {
17 System.out.println("bar");
18 }
19 }
20
21 // 不使用注解
22 public class Synchronized {
23 private static final Object $LOCK = new Object[0];
24 private final Object $lock = new Object[0];
25 private final Object readLock = new Object();
26
27 public static void hello() {
28 synchronized($LOCK) {
29 System.out.println("world");
30 }
31 }
32
33 public int answerToLife() {
34 synchronized($lock) {
35 return 42;
36 }
37 }
38
39 public void foo() {
40 synchronized(readLock) {
41 System.out.println("bar");
42 }
43 }
44 }

SpringBoot - Lombok使用详解5(@log、@Buinder、@SneakyThrows、@Synchronized)的更多相关文章

  1. Lombok 使用详解,简化Java编程

    前言 在 Java 应用程序中存在许多重复相似的.生成之后几乎不对其做更改的代码,但是我们还不得不花费很多精力编写它们来满足 Java 的编译需求 比如,在 Java 应用程序开发中,我们几乎要为所有 ...

  2. Spring全家桶——SpringBoot之AOP详解

    Spring全家桶--SpringBoot之AOP详解 面向方面编程(AOP)通过提供另一种思考程序结构的方式来补充面向对象编程(OOP). OOP中模块化的关键单元是类,而在AOP中,模块化单元是方 ...

  3. Springboot mini - Solon详解(六)- Solon的校验框架使用、定制与扩展

    Springboot min -Solon 详解系列文章: Springboot mini - Solon详解(一)- 快速入门 Springboot mini - Solon详解(二)- Solon ...

  4. Springboot mini - Solon详解(七)- Solon Ioc 的注解对比Spring及JSR330

    Springboot min -Solon 详解系列文章: Springboot mini - Solon详解(一)- 快速入门 Springboot mini - Solon详解(二)- Solon ...

  5. Lombok使用详解(转)

    本文转自https://blog.csdn.net/u010695794/article/details/70441432 2017年04月22日 15:17:00 阅读数:10394 Lombok使 ...

  6. SpringBoot之DispatcherServlet详解及源码解析

    在使用SpringBoot之后,我们表面上已经无法直接看到DispatcherServlet的使用了.本篇文章,带大家从最初DispatcherServlet的使用开始到SpringBoot源码中Di ...

  7. SpringBoot Profile使用详解及配置源码解析

    在实践的过程中我们经常会遇到不同的环境需要不同配置文件的情况,如果每换一个环境重新修改配置文件或重新打包一次会比较麻烦,Spring Boot为此提供了Profile配置来解决此问题. Profile ...

  8. Springboot mini - Solon详解(四)- Solon的事务传播机制

    Springboot min -Solon 详解系列文章: Springboot mini - Solon详解(一)- 快速入门 Springboot mini - Solon详解(二)- Solon ...

  9. Springboot mini - Solon详解(二)- Solon的核心

    Springboot min -Solon 详解系列文章: Springboot mini - Solon详解(一)- 快速入门 Springboot mini - Solon详解(二)- Solon ...

  10. Springboot mini - Solon详解(三)- Solon的web开发

    Springboot min -Solon 详解系列文章: Springboot mini - Solon详解(一)- 快速入门 Springboot mini - Solon详解(二)- Solon ...

随机推荐

  1. linux 复合页( Compound Page )的介绍

    1.复合页的定义: 复合页(Compound Page)就是将物理上连续的两个或多个页看成一个独立的大页,它可以用来创建hugetlbfs中使用的大页(hugepage),  也可以用来创建透明大页( ...

  2. java okio 找不到的问题

    问题描述: okio 找不到的问题 解决办法: 下载 jar_files.zip 在idea-File-Project Structure- Project Settings - Libraries ...

  3. Hyper-V虚拟机在Win2019server中共用一个公网IP

    Hyper-V虚拟机在Win2019server中共用一个公网IP 有时生产环境中希望一台宿主机上的多台虚拟机共用一个IP出口,按以下操作处理即可. 环境: Windows 2019 server D ...

  4. 自动化处理日志脚本 shell

    自动处理脚本 保留7天的,带详细时间戳, #!/bin/sh #description split logs file1=/var/log/messages file2=/var/log/rabbit ...

  5. A Novel Sequential Method to Train Physics Informed Neural Networks for Allen Cahn and Cahn Hilliard Equations

    一种新的顺序方法去求解关于时间的方程.个人感觉论文很差.(方法不新颖,写作很无聊,排版也有问题,内容也表述不清). 本文提出一种利用单个神经网络,在连续时间段上顺序求解偏微分方程的新型方案.关键思想是 ...

  6. 重试机制的实现(Guava Retry)

    重试机制的实现 重试作用: 对于重试是有场景限制的,参数校验不合法.写操作等(要考虑写是否幂等)都不适合重试. 远程调用超时.网络突然中断可以重试.外部 RPC 调用,或者数据入库等操作,如果一次操作 ...

  7. ONOS中新建分支并关联远程库

    新建分支并关联远程库 廖雪峰学习git教程网站:(多人协作) https://www.liaoxuefeng.com/wiki/896043488029600/900375748016320 git远 ...

  8. 3. Tooltip 工具提示

    1 <!DOCTYPE html> 2 <html lang="zh"> 3 <head> 4 <meta charset="U ...

  9. LaTex【六】表格排版—表格标题位置

    LaTex中表格排版--表格描述位置调整 LaTex模板大多默认将表格描述置于表格下方,可通过修改 \caption 的位置调整. 1. 位于表格下方(默认) \begin{table}[h] \be ...

  10. vue把后端传的数字 转成中文显示在页面