JAVA:面向切面编程AOP

野性酷女 2024-03-16 13:13 145阅读 0赞

一、定义

把某一些功能提取出来与某一对象进行隔离,提取之后可以对某哥单方面的功能进行修改和扩展

也就是把众多方法中的的所有公共代码抽取出来,放到某个地方集中管理

对业务逻辑的各个部分进行了隔离,从而降低业务逻辑各部分之间的耦合,提高程序的可重用性,提高开发效率。

二、面向切面思想体现

  1. 动态代理(AOP),比如说用动态代理去判断MVP中的model是否为空
  2. 在application中对activity注册生命周期的监听
  3. 基于第三方的编译工具:APT、AspectJ、Javassist等

三、与OOP(面向对象编程)的区别

OOP是把问题划分到单个模块

AOP是把涉及到众多模块的某一类问题进行统一管理,

四、AOP使用场景

  • 参数校验和判空
  • 权限检测、网络检测等
  • 埋点
  • 安全控制
  • 日志记录
  • 性能统计
  • 异常处理
    替代防御性的 try-Catch
  • 缓存
    缓存某方法的返回值,下次执行该方法时,直接从缓存里获取
  • 热修复

五、AspectJ使用方法

@Aspect:声明切面,标记类
@Pointcut(切点表达式):定义切点,标记方法
@Before(切点表达式):前置通知,切点之前执行
@Around(切点表达式):环绕通知,切点前后执行
@After(切点表达式):后置通知,切点之后执行
@AfterReturning(切点表达式):返回通知,切点方法返回结果之后执行
@AfterThrowing(切点表达式):异常通知,切点抛出异常时执行

注:如果没有添加@Aspect,那么后面的注解一律不起作用

1.在项目下gradle添加依赖

  1. buildscript {
  2. repositories {
  3. mavenCentral()
  4. }
  5. dependencies {
  6. classpath 'org.aspectj:aspectjtools:1.8.9'
  7. classpath 'org.aspectj:aspectjweaver:1.8.9'
  8. }
  9. }
  10. plugins {
  11. ……
  12. }

2.在使用的模块gradle添加

  1. import org.aspectj.bridge.IMessage
  2. import org.aspectj.bridge.MessageHandler
  3. import org.aspectj.tools.ajc.Main
  4. android {
  5. ……
  6. }
  7. final def log = project.logger
  8. final def variants = project.android.applicationVariants
  9. variants.all { variant ->
  10. if (!variant.buildType.isDebuggable()) {
  11. log.debug("Skipping non-debuggable build type '${variant.buildType.name}'.")
  12. return;
  13. }
  14. JavaCompile javaCompile = variant.javaCompile
  15. javaCompile.doLast {
  16. String[] args = ["-showWeaveInfo",
  17. "-1.8",
  18. "-inpath", javaCompile.destinationDir.toString(),
  19. "-aspectpath", javaCompile.classpath.asPath,
  20. "-d", javaCompile.destinationDir.toString(),
  21. "-classpath", javaCompile.classpath.asPath,
  22. "-bootclasspath", project.android.bootClasspath.join(File.pathSeparator)]
  23. log.debug "ajc args: " + Arrays.toString(args)
  24. MessageHandler handler = new MessageHandler(true);
  25. new Main().run(args, handler);
  26. for (IMessage message : handler.getMessages(null, true)) {
  27. switch (message.getKind()) {
  28. case IMessage.ABORT:
  29. case IMessage.ERROR:
  30. case IMessage.FAIL:
  31. log.error message.message, message.thrown
  32. break;
  33. case IMessage.WARNING:
  34. log.warn message.message, message.thrown
  35. break;
  36. case IMessage.INFO:
  37. log.info message.message, message.thrown
  38. break;
  39. case IMessage.DEBUG:
  40. log.debug message.message, message.thrown
  41. break;
  42. }
  43. }
  44. }
  45. }
  46. dependencies {
  47. ……
  48. implementation 'org.aspectj:aspectjrt:1.8.9'
  49. }

3.创建注解,标记切点

  1. @Target(ElementType.FIELD)
  2. @Retention(RetentionPolicy.RUNTIME)ButterKnife SOURCE 代表资源
  3. public @interface CheckNet {
  4. }

4.处理切点

  1. @Aspect //声明切面
  2. public class SectionAspect {
  3. /**
  4. * 找到处理的切点
  5. * * *(..) 可以处理所有的方法
  6. */
  7. @Pointcut("execution(@com.darren.architect_day02.CheckNet * *(..))")
  8. public void checkNetBehavior() {
  9. }
  10. /**
  11. * 处理切面
  12. */
  13. @Around("checkNetBehavior()")
  14. public Object checkNet(ProceedingJoinPoint joinPoint) throws Throwable {
  15. MethodSignature signature = (MethodSignature) joinPoint.getSignature();
  16. CheckNet checkNet = signature.getMethod().getAnnotation(CheckNet.class);
  17. if (checkNet != null) {
  18. Object object = joinPoint.getThis();
  19. Context context = getContext(object);
  20. if (context != null) {
  21. if (!isNetworkAvailable(context)) {
  22. //处理公共事件
  23. Toast.makeText(context,"请检查您的网络",Toast.LENGTH_LONG).show();
  24. return null;
  25. }
  26. }
  27. }
  28. return joinPoint.proceed();
  29. }
  30. }

六、AspectJ原理

运行时,使用了aspectJ第三方编译器,aspectJ去修改class文件,不影响性能

发表评论

表情:
评论列表 (有 0 条评论,145人围观)

还没有评论,来说两句吧...

相关阅读

    相关 面向切面编程AOP

    1. 定义 AOP意为:[面向切面编程][Link 1],通过[预编译][Link 2]方式和运行期动态代理实现程序功能的统一维护的一种技术。AOP可以对业务逻辑的各...

    相关 JAVA面向切面编程AOP

    一、定义 把某一些功能提取出来与某一对象进行隔离,提取之后可以对某哥单方面的功能进行修改和扩展 也就是把众多方法中的的所有公共代码抽取出来,放到某个地方集中管理 对业

    相关 AOP面向切面编程

    [1.引言][1.]         原文地址:[点击打开链接][1.] 软件开发的目标是要对世界的部分元素或者信息流建立模型,实现软件系统的工程需要将系统分解成可以创

    相关 AOP面向切面编程

    AOP 面向切面编程 1.使用场景还原 当我们打开京东 app 进入首页,如果当前是没有网络的状态,里面的按钮点击是没有反应的。只有当我们打开网络的情况下,点击按钮

    相关 AOP面向切面编程简介

           AOP这个词相信大家都没有接触太多过,但是实际上你们已经有所接触了,就在设计模式中。AOP所用的思想其实和设计模式是一样的,即在不修改原代码的情况下统一增加或者修