博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android AOP概述
阅读量:7112 次
发布时间:2019-06-28

本文共 2867 字,大约阅读时间需要 9 分钟。

AOP是什么?

网上很多人在介绍AOP时都这样说:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。个人认为这句话是错误。AOP和OOP一样,是一种程序设计思想,而非技术手段。

程序设计有六大原则,其中第一原则就是单一职责原则。意思就是一个类只负责一件事情。这与OOP的封装特性相得益彰。在这个条件下,我们的程序会被分散到不同的类、不同的方法中去。这样做的好处是降低了类的复杂性,提高了程序的可维护性。但是同时,它也使代码变得啰嗦了。例如,我们要为方法添加调用日志,那就必须为所有类的所有方法添加日志调用,尽管它们都是相同的。为了解决上述问题,AOP应运而生了。

AOP旨在将横切关注点与业务主体进行分类,从而提高程序代码的模块化程度。横切关注点是一个抽象的概念,它是指那些在项目中贯穿多个模块的业务。上个例子中日志功能就是一个典型的横切关注点。

AOP的几种实现方式

动态代理

动态代理是一种设计模式。它有以下特征:

  • 我们不需要自己写代理类。
  • 运行期通过接口直接生成代理对象。
  • 运行期间才确定代理哪个对象。

以下面这个例子为例,我们看一下动态代理的类图结构。

通常我们的APP都有一部分功能要求用户登录之后才能访问。如修改密码、修改用户名等功能。当用户打算使用这些功能时,我们一般要对用户的登录状态进行判断,只有用户登录了,才能正常使用这些功能。而如果用户未登录,我们的APP要跳转到登录页。就以修改密码为例我们看一下动态代理的类图。

InvocationHandler是Java JDK提供的动态代理的入口,用来对被代理对象的方法做处理。

代码如下:

public static class LoginCheckHandler implements InvocationHandler {        private static 
T proxy(S source, Class
tClass) { return (T) Proxy.newProxyInstance(Main.class.getClassLoader(), new Class[]{tClass}, new LoginCheckHandler(source)); } private Object mSource; LoginCheckHandler(Object source) { this.mSource = source; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { if(!checkLogin()){ jumpToLoginActivity(); return null; } return method.invoke(mSource, args); } private boolean checkLogin(){ System.out.println("用户未登录"); return false; } private void jumpToLoginActivity(){ System.out.println("跳转到登录页"); } } public class Client { public static void main(String[] args) { IUserSetting source = new UserSetting(); IUserSetting iUserSetting = LoginCheckHandler.proxy(source,IUserSetting.class); iUserSetting.changePwd("new Password"); } }复制代码

经过这样封装之后,检查登录跳转登录页的逻辑作为横切关注点就和业务主体进行了分离。当有新的需求需要登录检查时,我们只需要通过LoginCheckHandler生成新的代理对象即可。

APT

APT(Annotation Processing Tool)是一种编译期注解处理技术。它通过定义注解和处理器来实现编译期生成代码的功能,并且将生成的代码和源代码一起编译成.class文件。通过APT技术,我们将横切关注点封装到注解处理器中,从而实现横切关注点与业务主体的分离。更详细的介绍请移步。

AspectJ

AspectJ就是一种编译器,它在Java编译器的基础上增加了关键字识别和编译方法。因此,AspectJ可以编译Java代码。它还提供了Aspect程序。在编译期间,将开发者编写的Aspect程序织入到目标程序中,扩展目标程序的功能。开发者通过编写AspectJ程序实现AOP功能。更详细的介绍请移步。

Transform + Javassist/ASM

是Android Gradle提供的,可以操作字节码的一种方式。App编译时,源代码首先会被编译成class,然后再被编译成dex。在class编译成dex的过程中,会经过一系列Transform处理。Javassist/ASM是一个能够非常方便操作字节码的库。我们通过它们可以修改编译的.class文件。利用这种方式,我们将横切关注点封装到Transform,来达到与业务主体分离的目的。更详细的介绍请移步。

我们可以用来实现什么功能?

利用AOP可以做一些很有意思的事情。一些知名的开源框架,他们都采用了AOP的思想。例如:ButterKnife、Retrofit、Hugo等。另外,AOP在性能检测和埋点技术上出现了百家争鸣的局面。

  • 性能检测与优化。360的、滴滴的、Jake Wharton大神的。
  • 埋点技术。罗辑思维的、神策数据的、网易的等。

除此之外,借助AOP我们还可以实现以下功能:

  • 通常我们在向服务器请求数据时,会显示一个Loding,等到结果返回后再隐藏它。我们可以通过AOP技术把显示、隐藏Loding的动作和业务主体分离开。

  • 权限管理。给大家推荐一个开源库,用AspectJ解决了权限问题。

转载于:https://juejin.im/post/5d0a0dfce51d45775d516f94

你可能感兴趣的文章
一个可以提高开发效率的Git命令-- Cherry-Pick
查看>>
IBM发表论文:可能已找到处理量子计算退相干的方法
查看>>
.NET Core 3.0中的数据库驱动框架System.Data
查看>>
Firefox Quantum支持跨浏览器插件架构
查看>>
Oracle收购Talari,第一家SD-WAN公有云提供商出现
查看>>
数据库设计中的9大常见错误
查看>>
当我们在谈大前端的时候,我们谈的是什么
查看>>
柔性自动化在物流的应用及探索
查看>>
区块链和数据科学:如果同时应用这两种技术,将会实现什么?
查看>>
es动态index查询
查看>>
将敏捷应用于工业机械开发
查看>>
有赞HBase技术实践:读流程解析与优化
查看>>
微软最具价值技术专家:我的16年软件开发经验总结
查看>>
腾讯云+未来高峰对话:智能+时代的创新与探索
查看>>
C# 8中的默认接口方法
查看>>
实现TeX的算法:回首编程技术的过去三十年
查看>>
京东构建了全球最大的Kubernetes集群,没有之一
查看>>
Facebook是如何缩短iOS应用启动时间的
查看>>
又拍云CDN再出力作,三驾马车为视频护航
查看>>
Java RESTful Web Service实战
查看>>