之前在实习的时候,公司都用@Setter和@Getter注解为JavaBean自动生成set和get方法,大大降低了代码量。查看此注解,发现他们是在一个lombok的包下面:
还发现了一些其他的注解类。
度娘发现:
1.Lombok是一个可以通过简单的注解形式来帮助我们简化消除一些必须有但显得很臃肿的Java代码的工具,通过使用对应的注解,可以在编译源码的时候生成对应的方法。
2.Lombok提供了简单的注解的形式来帮助我们简化消除一些必须有但显得很臃肿的 java 代码。特别是相对于 POJO。
由上面可知,Lombok注解是编译时注解,在编译时根据注解自动生成相应的方法。
Lombok官方文档:https://projectlombok.org/features/all
在此只记录常用注解,方便以后自己使用。由于最近使用SpringBoot框架,发现父pom中已经包含此Lombok的jar包,在项目工程中只要直接引用对应的jar包依赖就可以:
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
注意,不需要加version信息,因为它是一个子pom,
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.6.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
父pom中的Lombok:
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
</dependency>
常用注解介绍:
- @Setter 注解在属性上,为属性提供 setting 方法
- @Getter 注解在属性上,为属性提供 getting 方法
- @ToString 注解在类上,生成toString方法,默认情况下,会输出类名、所有属性,属性会按照顺序输出。
- @Data 注解在类上,提供类所有属性的 getting 和 setting 方法,此外还提供了equals、canEqual、hashCode、toString 方法
- @NoArgsConstructor 注解在类上,为类提供一个无参的构造方法
- @AllArgsConstructor 注解在类上,为类提供一个全参的构造方法
- @EqualsAndHashCode 默认情况下,会使用所有非瞬态(non-transient)和非静态(non-static)字段来生成equals和hascode方法,也可以指定具体使用哪些属性。
- @Log4j 注解在类上,为类提供一个static属性名为log 的 log4j 日志对象
直接上代码:
- @Setter @Getter
public class Person{
@Getter @Setter
private String name;
@Getter @Setter
private int money;
public static void main(String[] args){
Person person=new Person();
user.setName("XXX");
user.setMoney(123456789);
System.out.println(user.getName());
System.out.println(user.getMoney());
}
}
输出:
XXX
123456789
- @ToString
@ToString
public class Person {
@Getter
@Setter
private String name;
@Getter
@Setter
private int money;
public static void main(String[] args) {
Person person = new Person();
person.setName("XXX");
person.setMoney(123456789);
System.out.println(person.getName());
System.out.println(person.getMoney());
System.out.println(person.toString());
}
}
输出:
XXX
123456789
Person(name=XXX,money=123456789)
- @EqualsAndHashCode
@ToString
@EqualsAndHashCode
public class Person {
@Getter @Setter
private String name;
@Getter @Setter
private int money;
public static void main(String[] args) {
Person person1 = new Person();
person1.setName("XXX");
person1.setMoney(123456789);
Person person2=new Person();
person2.setName("XXX");
person2.setMoney(123);
Person person3=new Person();
person3.setName("XXX");
person3.setMoney(123456789);
System.out.println(person1.equals(person2));
System.out.println(person1.equals(person3));
}
}
输出:
false
true
- @Data
@Data
//@ToString
//@EqualsAndHashCode
public class Person {
// @Getter @Setter
private String name;
// @Getter @Setter
private int money;
public static void main(String[] args) {
Person person1 = new Person();
person1.setName("XXX");
person1.setMoney(123456789);
System.out.println(person1.getName());
System.out.println(person1.getMoney());
System.out.println(person1.toString());
Person person2=new Person();
person2.setName("XXX");
person2.setMoney(123);
Person person3=new Person();
person3.setName("XXX");
person3.setMoney(123456789);
System.out.println(person1.equals(person2));
System.out.println(person1.equals(person3));
}
}
输出:
XXX
123456789
Person(name=XXX, money=123456789)
false
true
- @NoArgsConstructor @AllArgsConstructor
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Person {
private String name;
private int money;
public static void main(String[] args) {
Person person1 = new Person();
Person person2=new Person("XXX",123456789);
System.out.println(person1);
System.out.println(person2);
}
}
等同于:
@Data
//@NoArgsConstructor
//@AllArgsConstructor
public class Person {
private String name;
private int money;
//无参构造函数
public Person(){}
//全参构造函数
public Person(String name,int money){
this.name=name;
this.money=money;
}
public static void main(String[] args) {
Person person1 = new Person();
Person person2=new Person("XXX",123456789);
System.out.println(person1);
System.out.println(person2);
}
}
输出:
Person(name=null, money=0)
Person(name=XXX, money=123456789)
- @Log4j
/**
*没有只用@Log4j
*/
@Data
public class Person {
private Logger logger=Logger.getLogger(getClass());
private String name;
private int money;
public static void main(String[] args) {
Person person = new Person();
person.logger.info("----------没有使用@Log4j 注解-----------");
}
}
/**
*使用@Log4j
*/
@Data
@Log4j(topic = "提示信息:")
public class Person {
private String name;
private int money;
public static void main(String[] args) {
Person person = new Person();
person.log.info("----------没有使用@Log4j 注解-----------");
}
}
输出 :
19:04:25.938 [main] INFO 提示信息: - ----------没有使用@Log4j 注解-----------
19:05:50.206 [main] INFO 提示信息: - ----------使用@Log4j 注解-----------
———————————————这里是分割线—————————————————
Lombok的注释会在代码编译时期,用JSR 269 Pluggable Annotation Processing API(插入式注解处理工具) 生成相应代码。但是在开发阶段,源代码中调用Setter、getter等方法,IDE发现没有这些代码会报错,影响美观,对于强迫症的人来说是不能容忍的。
这里补上IDEA工具中添加Lombok插件方法,来取消在工程开发时,IDE对setter、getter等方法调用的报错问题。
Step1:File->Setting…
Step2:Plugins->输入Lombok,点击Browse repositories
Step3:找到Lombok Plugin,然后点击Install plugin按钮
最后推荐一篇讲了Lombok原理的文章:http://blog.csdn.net/ghsau/article/details/52334762