返回顶部
首页 > 资讯 > 后端开发 > 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://lsjlt.com/news/404511.html(转载时请注明来源链接)

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

猜你喜欢
  • JAVA:面向切面编程AOP
    一、定义         把某一些功能提取出来与某一对象进行隔离,提取之后可以对某哥单方面的功能进行修改和扩展         也就是把众多方法中的的所有公共代码抽取出来,放到某个地方集中管理         对业务逻辑的各个部分进行了隔离...
    99+
    2023-09-12
    java AOP
  • spring6-AOP面向切面编程
    面向切面编程AOP 1、场景模拟1.1、声明接口1.2、创建实现类1.3、创建带日志功能的实现类1.4、提出问题 2、代理模式2.1、概念2.2、静态代理2.3、动态代理2.4、测试 ...
    99+
    2023-10-21
    java 后端 spring aop 面向切面编程
  • AOP面向切面编程思想。
    目录 一、AOP工作流程 1、基本概念 2、AOP工作流程  二、AOP核心配置 1、AOP切入点表达式 2、AOP通知类型 三、AOP通知获取数据 1、获取参数 2、获取返回值 3、获取异常  四、AOP事务管理 1、Spring事务简介...
    99+
    2023-09-06
    spring java 后端
  • java开发AOP面向切面编程入门
    目录引言不好的解决方案面向过程的解决方案使用继承解决方案使用聚合的解决方案面向切面的编程基本概念基于Spring面向切面程序实现小结引言 在实际应用场景中,我们封装一个学生的类,这个...
    99+
    2024-04-02
  • Java面向切面编程AOP怎么实现
    这篇文章主要介绍“Java面向切面编程AOP怎么实现”,在日常操作中,相信很多人在Java面向切面编程AOP怎么实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java面向切面编程AOP怎么实现”的疑惑有所...
    99+
    2023-06-04
  • 【Spring】面向切面编程详解(AOP)
    文章目录 一、AOP概述什么是AOPAOP应用场景 二、AOP的基本术语术语介绍术语举例详解 三、AOP实例说明四、通知类型详解概述前置通知后置通知环绕通知最终通知 六、AOP实现声明式事务...
    99+
    2023-08-30
    spring java 后端
  • Spring面向切面编程AOP详情
    目录1. 面向切面编程2. AOP核心概念3. AOP的实现4. Spring 对AOP支持4.1 支持@Aspect4.2 声明一个切面4.3 声明一个切入点4.4 声明增强5. ...
    99+
    2024-04-02
  • Java aop面向切面编程(aspectJweaver)案例详解
    面向切面编程的目的就是:在不改变别人的代码的前提下,在别人代码方法执行前或后,执行(切入自己的逻辑) 准备:idea+maven+aspectjweaver-1.8.9.jar ...
    99+
    2024-04-02
  • Java aop面向切面编程有什么特点
    面向切面编程(AOP)是一种软件开发范式,用于将横切关注点(cross-cutting concerns)与主要业务逻辑分离。 A...
    99+
    2024-03-01
    Java
  • Python 面向切面编程 AOP 及装饰器
    目录什么是 AOP装饰器函数装饰器类装饰器1、函数装饰函数2、类装饰函数3、函数装饰类4、类装饰类什么是 AOP AOP,就是面向切面编程,简单的说,就是动态地将代码切入到类的指定方...
    99+
    2024-04-02
  • Spring框架AOP面向切面编程原理全面分析
    目录1.什么是AOPAOP面向切面的优势AOP需要添加的依赖2.简述AOP工作运行原理动态创建的总结:3.使用Spring创建AOP测试类Spring.xml1.什么是AOP AOP...
    99+
    2024-04-02
  • Springboot怎样使用Aspectj实现AOP面向切面编程
    Springboot怎样使用Aspectj实现AOP面向切面编程,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。要在 Springboot中声明 AspectJ 切面需在 IOC...
    99+
    2023-06-22
  • Springboot如何使用Aspectj实现AOP面向切面编程
    目录要在 Springboot中声明 AspectJ 切面引入jar包       网上也有说要在application.properties...
    99+
    2024-04-02
  • SpringAOP面向切面编程
    文章目录 一. AOP是什么?二. AOP相关概念三. SpringAOP的简单演示四. SpringAOP实现原理 一. AOP是什么? AOP(Aspect Oriented Prog...
    99+
    2023-10-11
    java spring AOP 面向切面 动态代理
  • Quarkus中的依赖注入DI和面向切面aop编程
    目录前言JSR365:Java2.0的上下文和依赖注规范Bean声明和依赖注入Bean的生命周期条件化初始Bean面向切面编程aopBean列表接口结语前言 做java开发的肯定清楚...
    99+
    2024-04-02
  • .NETCore利用动态代理实现AOP(面向切面编程)
    目录1.介绍1.1 动态代理作用1.2 原生DispatchProxy类介绍1.3简单介绍一下:IL代码2.实现2.1 继承DispatchProxy2.2 定义handle接口2....
    99+
    2024-04-02
  • Python面向切面编程AOP及装饰器怎么使用
    本篇内容主要讲解“Python面向切面编程AOP及装饰器怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Python面向切面编程AOP及装饰器怎么使用”吧!什么是 AOPAOP,就是面向切...
    99+
    2023-06-30
  • Java面向切面编程怎么实现
    在Java中实现面向切面编程,可以使用以下几种方式:1. 使用代理模式:通过创建代理类,将横切逻辑封装在代理类中,然后在实际业务类中...
    99+
    2023-08-08
    Java
  • Spring使用AspectJ的注解式实现AOP面向切面编程
    目录1、认识Spring AOP1.1 AOP的简介1.2 AOP中的概念 切入点(pointcut):2、认识AspectJ 2.1 AspectJ的简介2.2 Spring AO...
    99+
    2024-04-02
  • 自己编写IOC控制反转及AOP面向切面
    目录1.概念IOC:Inversion of control 控制反转AOP:Aspect oriented Programming 面向切面编程2.通过银行转账案例手写IOC和AO...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作