Android APT
Android annotation process tool 是一种处理注释的工具,它对源代码文件进行检测找出其中的Annotation,使用Annotation进行额外的处理。基于 Java生成代码,利于注解生成新的文件,有一定的侵入性。
APT的处理要素:
注解处理器(AbstractProcess)+代码处理(javaPoet)+处理器注册(AutoService)+apt
APT处理annotation的流程:
1 | 1. 定义注解(如 ) |
优秀讲解:https://juejin.cn/post/6844903923233341453
AOP
AOP是Aspect Oriented Programming的缩写,即『面向切面编程』。它和OOP都是编程的不同思想,OOP即『面向对象编程』,它提倡的是将功能模块化,对象化,而AOP的思想,它提倡的是针对同一类问题的统一处理,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。
常用技术:Aspectj , ASM
ASM
ASM是一个通用的Java字节码操作和分析框架。 它可以用于修改现有类或直接以二进制形式动态生成类。 ASM提供了一些常见的字节码转换和分析算法,可以从中构建自定义复杂转换和代码分析工具。ASM提供与其他Java字节码框架类似的功能,但专注于性能。 因为它的设计和实现尽可能小而且快,所以它非常适合在动态系统中使用。
核心类:
① ClassReader:该类用来解析编译过的class字节码文件。
② ClassWriter:该类用来重新构建编译后的类,比如说修改类名、属性以及方法,甚至可以生成新的类的字节码文件。
③ ClassAdapter:该类也实现了ClassVisitor接口,它将对它的方法调用委托给另一个ClassVisitor对象。
AspectJ
AspectJ 通过注解的形式来标注切入点、切入对象等,然后在代码编译期间将代码织入到java的字节码中。
CI
Continuous Integration,即“持续集成”
CICD 是持续集成(Continuous Integration)、持续交付(Continuous Delivery)与持续部署(Continuous Deployment)的简称。指在开发过程中自动执行一系列脚本来减低开发引入 bug 的概率,在新代码从开发到部署的过程中,尽量减少人工的介入。
IOC
Inversion of Control,即“控制反转”,它是一种设计思想,并不是什么技术;在 Java 中,IOC 意味着将我们设计好的对象交给容器控制,而不是传统的需要时在内部构造直接控制;
谁控制谁?控制了什么?
- 谁控制了谁: IoC 控制了对象;
- 控制了什么: 主要控制了外部资源的获取,不仅限于对象,包括文件等资源;
什么为正转?什么为反转?
- 正转: 在我们需要某个对象的时候,需要自己主动的去构建对象以及其所依赖的对象;
- 反转: 在我们需要某个对象的时候,只需要在 IoC 容器中获取所需对象,无需关心创建过程以及其中的依赖对象;全盘由 IoC 容器帮我们创建对象以及注入其所依赖的对象,在这里我们把对象的控制权反转给了 IoC 容器,所以称为反转;
DI
Dependency Injection,即”依赖注入”,就是由容器动态的将某个依赖注入到组件中。通过依赖注入机制,我们只需要简单的配置,无需任何代码就可以指定目标所需要的资源,从而完成自身的业务逻辑;我们无需关心具体的资源来自何处,提升了系统灵活性和可扩展性。
DI 可以看作是 IoC 的一种实现方式,IoC 是一种思想,而 DI 是一种设计模式,是一种实现 IoC 的模式。
依赖注入的三种方式
- 构造方法注入: 被注入的对象可以通过在其构造方法中声明参数列表,让 IoC 容器知道它需要依赖哪些对象
- setter 注入: 为其需要依赖的对象增加 setter 方法,可以通过 setter 方法将其依赖的对象注入到对象中
- 接口注入: 对于接口注入来说,如果被注入对象想要 IoC 容器为其注入依赖对象,就必须实现某个接口,这个接口提供了一个方法,用来为其注入依赖对象。但是从注入方式的使用来说,接口注入是现在不提倡的一种方式,基本处于”退役”状态,因为它强制被注入实现对象不必要的依赖。
SPI
SPI ,全称为 Service Provider Interface,是一种服务发现机制。它通过在ClassPath路径下的META-INF/services文件夹查找文件,自动加载文件里所定义的类。
这一机制为很多框架扩展提供了可能,比如在Dubbo、JDBC中都使用到了SPI机制。
服务发现
在传统的系统部署中,服务运行在一个固定的已知的 IP 和端口上,如果一个服务需要调用另外一个服务,可以通过地址直接调用,但是,在虚拟化或容器话的环境中,服务实例的启动和销毁是很频繁的,服务地址在动态的变化,如果需要将请求发送到动态变化的服务实例上,至少需要两个步骤:
服务注册 — 存储服务的主机和端口信息
服务发现 — 允许其他用户发现服务注册阶段存储的信息
服务发现的主要优点是可以无需了解架构的部署拓扑环境,只通过服务的名字就能够使用服务,提供了一种服务发布与查找的协调机制。服务发现除了提供服务注册、目录和查找三大关键特性,还需要能够提供健康监控、多种查询、实时更新和高可用性等。
对于移动客户端来说,服务发现用于模块间解耦,通过接口或者特定注解标识,获取对应的实现类
感谢:
https://juejin.cn/post/6844904162992357383