最近开发微服务的时候,用上了IDEA的一个插件Lombok,用Lombok注解确实省去了很多不必要的代码,程序也显得简练优雅。
Lombok介绍
lombok的初心是通过简单注解来消除实体Bean冗长代码,是程序看起来更简洁优雅。
目前lombok注解有
@Setter@Getter@Data@Log@AllArgsConstructor@NoArgsConstructor@EqualsAndHashCode@NonNull@Cleanup@ToString@RequiredArgsConstructor@Value@SneakyThrows@Synchronized
在实际项目中用的最多的是@Data,该注解可以为对象属性可以省去大量Getter,Setter代码。
Lombok安装
在IDEA菜单File的Setting –> 点击Plugins选项 –> 选择Browse repositories –>输入框搜索lombok –> 点击安装 –> 安装完成重启IDEA –> 完成安装
Lombok使用
Maven引入jar
org.projectlombok lombok 1.16.14
定义实体
import lombok.Data;@Datapublic class GroupPolicyEntity { private String policyNo; private String policyName; private Integer grp; private Integer normal; private Integer unread; }
最终代码效果图
Lombok工作原理
核心原理在注解的解析上。
熟悉java注解同学都知道,从Jdk1.5开始引入注解模式,并提供两种注解解析模式
第一种 运行时解析模式
将@Retention设置为RetentionPolicy.RUNTIME的class文件在编译器 只有在运行时调用是才会解析的注解,通过JDK反射自动装配对象。
在java.lang.reflect反射包中提供了一个叫AnnotatedElement接口,该接口定义了获取注解信息的几个方法,常用的Class、Constructor、Field、Method等都实现了该接口
拿SpringBootApplication举个栗子
@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)@Documented@Inherited@SpringBootConfiguration@EnableAutoConfiguration@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class), @Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })public @interface SpringBootApplication { ...}
我们看到SpringBootApplication类上有个@Retention(RetentionPolicy.RUNTIME),就是告诉编译器,注解不仅要保存到class文件中,而且在运行期,jvm加载class文件之后,仍然要存在。
通常情况下,我们自定义的注解都是采用这种方式,来实现自己特定的业务逻辑。
第二种 编译时解析模式 (插件化注解处理:
Pluggable Annotation Processing API)
执行的流程如下:
- javac对源代码进行分析,生成了一棵抽象语法树(AST)
- 运行过程中调用实现了“JSR 269 API”的Lombok程序
- 此时Lombok就对第一步骤得到的AST进行处理,找到@Data注解所在类对应的语法树(AST),然后修改该语法树(AST),增加getter和setter方法定义的相应树节点
- javac使用修改后的抽象语法树(AST)生成字节码文件,即给class增加新的节点(代码块)
lombok本质上就是基于JSR 269的一种实现。
JSR 269官方原文:
Goals:
By removing apt from the JDK, annotation processing can finish transitioning
to the superior, standardized JSR 269 API.
The apt annotation processing framework is JDK-specific and dates back to JDK
5. The functionality of the API was standardized with JSR 269, which shipped
as part of Java SE 6. In JDK 7, the entirety of the apt API was deprecated.
Impacts:
After this change, users of annotation processing will have to use the JSR
269 annotation processing facility, which has been supported in javac since
JDK 6. Since apt is just part of the JDK and not part of Java SE, there is a
looser compatibility contract around this component than around an API in
java.* or javax.*. The removal of a command line tool from the JDK is not
unprecedented, but the removal of apt should be clearly described in the
release notes and similar documents.
大意是说apt (annotation processing framework)基于JDK1.5,在JDK1.7中,apt的API不建议使用,原因有如下两点:
- APT集成在com.sun.mirror非标准包下
- 没有集成到javac中,需要额外运行
从JDK1.6,JSR 269成为JDK的一部分,开始支持javac。
参考:
https://projectlombok.org/features/all
大家好,我是Wooola,10年JAVA老兵,擅长微服务,分布式,并发,工作流。请大家多多关注我。