iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > JAVA >JAVA:面向切面编程AOP
  • 893
分享到

JAVA:面向切面编程AOP

javaAOP 2023-09-12 12:09:04 893人浏览 薄情痞子
摘要

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

一、定义

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

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

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

二、面向切面思想体现

  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,那么后面的注解一律不起作用

项目下gradle添加依赖

buildscript {    repositories {        MavenCentral()    }    dependencies {        classpath 'org.aspectj:aspectjtools:1.8.9'        classpath 'org.aspectj:aspectjweaver:1.8.9'    }}plugins {    ……}

在使用的模块gradle添加

import org.aspectj.bridge.IMessageimport org.aspectj.bridge.MessageHandlerimport org.aspectj.tools.ajc.Mainandroid {    ……} final def log = project.loggerfinal def variants = project.android.applicationVariants variants.all { variant ->    if (!variant.buildType.isDebuggable()) {        log.debug("Skipping non-debuggable build type '${variant.buildType.name}'.")        return;    }     JavaCompile javaCompile = variant.javaCompile    javaCompile.doLast {        String[] args = ["-showWeaveInfo",                         "-1.8",                         "-inpath", javaCompile.destinationDir.toString(),                         "-aspectpath", javaCompile.classpath.asPath,                         "-d", javaCompile.destinationDir.toString(),                         "-classpath", javaCompile.classpath.asPath,                         "-bootclasspath", project.Android.bootClasspath.join(File.pathSeparator)]        log.debug "ajc args: " + Arrays.toString(args)         MessageHandler handler = new MessageHandler(true);        new Main().run(args, handler);        for (IMessage message : handler.getMessages(null, true)) {            switch (message.getKind()) {                case IMessage.ABORT:                case IMessage.ERROR:                case IMessage.FAIL:                    log.error message.message, message.thrown                    break;                case IMessage.WARNING:                    log.warn message.message, message.thrown                    break;                case IMessage.INFO:                    log.info message.message, message.thrown                    break;                case IMessage.DEBUG:                    log.debug message.message, message.thrown                    break;            }        }    }}dependencies {    ……    implementation 'org.aspectj:aspectjrt:1.8.9'}

创建注解,标记切点

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

处理切点

@Aspect //声明切面public class SectionAspect {        @Pointcut("execution(@com.darren.architect_day02.CheckNet * *(..))")    public void checkNetBehavior() {    }        @Around("checkNetBehavior()")    public Object checkNet(ProceedingJoinPoint joinPoint) throws Throwable {        MethodSignature signature = (MethodSignature) joinPoint.getSignature();        CheckNet checkNet = signature.getMethod().getAnnotation(CheckNet.class);        if (checkNet != null) {            Object object = joinPoint.getThis();            Context context = getContext(object);            if (context != null) {                if (!isNetworkAvailable(context)) {                    //处理公共事件                    Toast.makeText(context,"请检查您的网络",Toast.LENGTH_LONG).show();                    return null;                }            }        }        return joinPoint.proceed();    }}

六、AspectJ原理

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

来源地址:https://blog.csdn.net/weixin_42277946/article/details/131034556

--结束END--

本文标题: JAVA:面向切面编程AOP

本文链接: https://www.lsjlt.com/news/404511.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作