java mvc 新趋势——从运行期间类扫描到编译期间

简介: 简介 今天我要讲解的是主角是 Annotation Processor,她不是什么新技术 jdk 1.6 就存在了。 Annotation Processor是javac的一个工具,它用来在编译时扫描和处理注解。

简介

今天我要讲解的是主角是 Annotation Processor,她不是什么新技术 jdk 1.6 就存在了。 Annotation Processor是javac的一个工具,它用来在编译时扫描和处理注解。通过Annotation Processor可以获取到注解和被注解对象的相关信息,然后根据注解自动生成Java代码,省去了手动编写,提高了编码效率。

案例

大部分java 开发者每天也在使用她,比较著名的就是 Lombok。

在项目中使用Lombok可以减少很多重复代码的书写。比如说constructor/getter/setter/toString等方法的编写。 如图:

image

感触最大的就是,添加或更改了 feild 属性,再也不用去生成 get set 了。

spring boot 中最典型的算 spring-boot-configuration-processor 了。他会在代码编译期间将我们的配置数据 spring-configuration-metadata.json 生成到 jar 包中。方便 idea 识别出来,并提供友好的提示。

如图:

image

spring 5 spring-context-indexer 浅析

生成 spring.components 文件

maven

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context-indexer</artifactId>
    <version>5.1.4.RELEASE</version>
    <scope>optional</scope>
</dependency>

Gradle

annotationProcessor "org.springframework:spring-context-indexer:5.1.4.RELEASE"

项目编译完成时就会就会生成 META-INF/spring.components 文件到 jar 包中。如图:(spring.components文件)

spring.components 解析和加载

  1. spring-context 中添加了一个 @Indexed 注解。
  2. spring ioc 基础注解 @Component 中组合了@Indexed注解,
  3. org.springframework.context.index.CandidateComponentsIndexLoader 则用来加载 spring.components, 标注的这些类。

问题

swagger 目前暂时还有问题,直到现在还没修复,详见 issues:https://github.com/springfox/springfox/issues/2763

优势

  1. 将运行期间的类扫描提前到了编译期间,增加服务启动速度。
  2. 避免各种容器类扫描的差异性,提搞兼容性。

链接

Spring 5 - spring-context-indexer:https://github.com/spring-projects/spring-framework/tree/master/spring-context-indexer

启发

在 Spring 5 - spring-context-indexer 的启发下,我开发了 mica-auto。编译期间自动生成 Spring boot 的 spring-devtools.properties, 扫描 @Configuration,自动生成到 spring.factories 文件,同时将 FeignClient 信息也生成到 spring.factories 中,供 mica 中完成 Feign 自动化配置。

再也不用担心忘了更改 spring.factories 文件而导致服务启动出错。

开源推荐

Spring boot 微服务高效开发 mica 工具集:https://gitee.com/596392912/mica
Avue 一款基于vue可配置化的神奇框架:https://gitee.com/smallweigit/avue
pig 宇宙最强微服务(架构师必备):https://gitee.com/log4j/pig
SpringBlade 完整的线上解决方案(企业开发必备):https://gitee.com/smallc/SpringBlade
IJPay 支付SDK让支付触手可及:https://gitee.com/javen205/IJPay

目录
相关文章
|
1天前
|
安全 Java 开发者
Java一分钟之-文件与目录操作:Path与Files类
【5月更文挑战第13天】Java 7 引入`java.nio.file`包,`Path`和`Files`类提供文件和目录操作。`Path`表示路径,不可变。`Files`包含静态方法,支持创建、删除、读写文件和目录。常见问题包括:忽略异常处理、路径解析错误和权限问题。在使用时,注意异常处理、正确格式化路径和考虑权限,以保证代码稳定和安全。结合具体需求,这些方法将使文件操作更高效。
10 2
|
1天前
|
安全 Java 开发者
Java一分钟之-Optional类:优雅处理null值
【5月更文挑战第13天】Java 8的`Optional`类旨在减少`NullPointerException`,提供优雅的空值处理。本文介绍`Optional`的基本用法、创建、常见操作,以及如何避免错误,如直接调用`get()`、误用`if (optional != null)`检查和过度使用`Optional`。正确使用`Optional`能提高代码可读性和健壮性,建议结合实际场景灵活应用。
16 3
|
1天前
|
存储 Java ice
【Java开发指南 | 第十六篇】Java数组及Arrays类
【Java开发指南 | 第十六篇】Java数组及Arrays类
8 3
|
1天前
|
Java 编译器 ice
【Java开发指南 | 第十五篇】Java Character 类、String 类
【Java开发指南 | 第十五篇】Java Character 类、String 类
11 1
|
1天前
|
存储 Java ice
【Java开发指南 | 第十四篇】Java Number类及Math类
【Java开发指南 | 第十四篇】Java Number类及Math类
9 1
|
1天前
|
存储 缓存 Java
【Java开发指南 | 第六篇】Java成员变量(实例变量)、 类变量(静态变量)
【Java开发指南 | 第六篇】Java成员变量(实例变量)、 类变量(静态变量)
9 2
|
1天前
|
Java 编译器
【Java开发指南 | 第一篇】类、对象基础概念及Java特征
【Java开发指南 | 第一篇】类、对象基础概念及Java特征
9 4
|
2天前
|
安全 Java 数据安全/隐私保护
Java一分钟之-Java反射机制:动态操作类与对象
【5月更文挑战第12天】本文介绍了Java反射机制的基本用法,包括获取Class对象、创建对象、访问字段和调用方法。同时,讨论了常见的问题和易错点,如忽略访问权限检查、未捕获异常以及性能损耗,并提供了相应的避免策略。理解反射的工作原理和合理使用有助于提升代码灵活性,但需注意其带来的安全风险和性能影响。
17 4
|
3天前
|
安全 Java 调度
Java一分钟:多线程编程初步:Thread类与Runnable接口
【5月更文挑战第11天】本文介绍了Java中创建线程的两种方式:继承Thread类和实现Runnable接口,并讨论了多线程编程中的常见问题,如资源浪费、线程安全、死锁和优先级问题,提出了解决策略。示例展示了线程通信的生产者-消费者模型,强调理解和掌握线程操作对编写高效并发程序的重要性。
43 3
|
3天前
|
移动开发 前端开发 Java
第一次用java17记录运行ruoyi-vue-plus5.X版本
第一次用java17记录运行ruoyi-vue-plus5.X版本