AOP 的详细说明以及基本的使用

83 篇文章 7 订阅
订阅专栏

AOP复习

1、AOP简介

AOP(Aspect-OrientedProgramming,面向切面编程),可以说是OOP(Object-Oriented Programing,面向对象编程)的补充和完善。

​ OOP引入封装、继承和多态性等概念来建立一种对象层次结构,用以模拟公共行为的一个集合。当我们需要为分散的对象引入公共行为的时候,OOP则显得无能为力。也就是说,OOP允许你定义从上到下的关系,但并不适合定义从左到右的关系。例如日志功能。日志代码往往水平地散布在所有对象层次中,而与它所散布到的对象的核心功能毫无关系。对于其他类型的代码,如安全性、异常处理和透明的持续性也是如此。这种散布在各处的无关的代码被称为横切(cross-cutting)代码,在OOP设计中,它导致了大量代码的重复,而不利于各个模块的复用。

而AOP技术则恰恰相反,它利用一种称为“横切”的技术

​ 剖解开封装的对象内部,并将那些影响了多个类的公共行为封装到一个可重用模块,并将其名为“Aspect”,即方面。所谓“方面”,简单地说,就是将那些与业务无关,却为业务模块所共同调用的逻辑或责任封装起来,便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可操作性和可维护性。AOP代表的是一个横向的关系,如果说“对象”是一个空心的圆柱体,其中封装的是对象的属性和行为;那么面向方面编程的方法,就仿佛一把利刃,将这些空心圆柱体剖开,以获得其内部的消息。而剖开的切面,也就是所谓的“方面”了。然后它又以巧夺天功的妙手将这些剖开的切面复原,不留痕迹。

在这里插入图片描述

2、AOP作用

想象下面的场景,开发中在多个模块间有某段重复的代码,我们通常是怎么处理的?显然,没有人会靠“复制粘贴”吧。在传统的面向过程编程中,我们也会将这段代码,抽象成一个方法,然后在需要的地方分别调用这个方法,这样当这段代码需要修改时,我们只需要改变这个方法就可以了。然而需求总是变化的,有一天,新增了一个需求,需要再多出做修改,我们需要再抽象出一个方法,然后再在需要的地方分别调用这个方法,又或者我们不需要这个方法了,我们还是得删除掉每一处调用该方法的地方。实际上涉及到多个地方具有相同的修改的问题我们都可以通过 AOP 来解决。

3、AOP基本术语

Advice 通知

AOP 的主要作用就是在不侵入原有程序的基础上实现对原有功能的增强, 而增强的方式就是添加通知,就是额外增强一个方法。按照不同的方式通知又分为前置、后置、环绕、异常、带有返回值。

JointPoint 连接点

​ 在上述通知的描述中我们知道,AOP增强就是为原有方法在不侵入的情况下额外添加了一个新的功能,**而新功能和原有方法之间是如何联系到一起的呢?**这里就是引入了连接点的概念了。在AOP中连接点的表现形式为

@Around("execution(* io.renren.test.service.Buy.Play(..))")
// 通过注解来把增强方法和原有方法链接到一起,实现了增强的功能。

Pointcut 切入点

​ 在上述连接点的叙述中,我们知道了AOP 是如何实现都原有功能增强的, 但是通过连接点,增强方法是如何增强原有方法的呢? 这里就需要切入点来实现对原有方法的切入。在AOP的代码中表现形式为

    @Around("execution(* io.renren.test.service.Buy.Play(..))")
    public void Around(ProceedingJoinPoint point) throws Throwable {

        System.out.println("环绕前.....");
        System.out.println(point);
    }

// ProceedingJoinPoint point  过程切入点, 增强方法在此实现对被增强方法的功能增强。通过切入点我们可以得到很多东西, 举例如下

        /**
         * 得到参数
         */
        Object[] args = point.getArgs();
        System.out.println("args=> " + args.toString());
        /**
         * 得到切入点的类型
         */
        String kind = point.getKind();
        System.out.println("kind=> " + kind);
        /**
         *  切入点 得到被增强方法的方法签名
         */
        MethodSignature methodSignature = (MethodSignature) point.getSignature();

        /**
         *  方法签名 到被增强方法的方法
         */
        Method method = methodSignature.getMethod();
        System.out.println("method = > " + method);
        /**
         *  方法 名 到被增强方法的方法 上面的注解
         */
        SysLog sysLog = method.getAnnotation(SysLog.class);
        TestAnnotation test = method.getAnnotation(TestAnnotation.class);
        System.out.println(sysLog.value());
        System.out.println(test.value());
        Signature signature = point.getSignature();
        String name = signature.getName();
        Class declaringType = signature.getDeclaringType();
        int modifiers = signature.getModifiers();
        String declaringTypeName = signature.getDeclaringTypeName();
        System.out.println("name= > " + name + " declaringType => " + declaringType + " modifiers => " + modifiers + " declaringTypeName => " + modifiers);
        System.out.println("signature=> " + signature);
        /**
         *    得到目标
         */
        Object target = point.getTarget();
        System.out.println("target=> " + target);
        System.out.println("环绕后.....");

Aspect 切面

	切面是一个类, **由通知和切点组成, 在AOP代码的实现中为主要部分。**, 而一个通知则包括; 切点、连接点, 所以说, 一个切面就直接包括 AOP中所有东西了。 
/**
 * 切面类
 *
 * @author cyt
 */

@Aspect
@Component
public class Point {

    @Before("execution(* io.renren.test.service.Buy.Play(..))")
    public void Before(ProceedingJoinPoint point) {
        System.out.println("男孩女都有自己喜欢的事情");
    } 
}

4、AOP通知方式

在这里插入图片描述

5、AOP基本使用

目录结构

在这里插入图片描述

主要: 接口、实现类、切面、配置类、测试类

接口和实现类

public interface Buy {
    public void Play(String info);  
}
@Component
public class BoyBuy implements Buy {

    @Override
    public void Play(String info) {
        System.out.println(info);
    }
}

配置类

@ComponentScan(basePackages = {"io.renren.test"})
@Configuration
@EnableAspectJAutoProxy(proxyTargetClass = true)
@ComponentScan(basePackageClasses = {io.renren.test.service.Buy.class})
public class config {

}

测试

public class Test {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(config.class);
        BoyBuy buy = context.getBean(BoyBuy.class);
        GirlBuy girl = context.getBean(GirlBuy.class);

        girl.Play("around info  ");
    }
}

在这里插入图片描述

AOP

/**
 * 切面类
 *
 * @author cyt
 */

@Aspect
@Component
public class Point {

     @Before("execution(* io.renren.test.service.Buy.Play(..))")
    public void Before() {
        System.out.println("男孩女都有自己喜欢的事情");
    }
}

在这里插入图片描述

开启环绕通知, 以及打印切入点的信息

  @Around("execution(* io.renren.test.service.Buy.Play(..))")
    public void Around(ProceedingJoinPoint point) throws Throwable {
        System.out.println("环绕前.....");
        System.out.println(point);
        /**
         * 得到参数
         */
        Object[] args = point.getArgs();
        System.out.println("args=> " + args.toString());
        /**
         * 得到切入点的类型
         */
        String kind = point.getKind();
        System.out.println("kind=> " + kind);
        /**
         *  切入点 得到被增强方法的方法签名
         */
        MethodSignature methodSignature = (MethodSignature) point.getSignature();

        /**
         *  方法签名 到被增强方法的方法
         */
        Method method = methodSignature.getMethod();
        System.out.println("method = > " + method);
        /**
         *  方法 名 到被增强方法的方法 上面的注解
         */
        SysLog sysLog = method.getAnnotation(SysLog.class);
        TestAnnotation test = method.getAnnotation(TestAnnotation.class);
        System.out.println(sysLog.value());
        System.out.println(test.value());
        Signature signature = point.getSignature();
        String name = signature.getName();
        Class declaringType = signature.getDeclaringType();
        int modifiers = signature.getModifiers();
        String declaringTypeName = signature.getDeclaringTypeName();
        System.out.println("name= > " + name + " declaringType => " + declaringType + " modifiers => " + modifiers + " declaringTypeName => " + modifiers);
        System.out.println("signature=> " + signature);
        /**
         *    得到目标
         */
        Object target = point.getTarget();
        System.out.println("target=> " + target);
        System.out.println("环绕后.....");
    }

在这里插入图片描述

直接编写连接点, 实现对方法的增强

我们定义了一个切点, 并且把切点配置到通知上面

    /**
     * 定义一个切点
     */
    @Pointcut("execution(* io.renren.test.service.Buy.Play(..))")
    public void AspectJPoint() {
    }

    @Before("AspectJPoint()")
    public void point1() {
        System.out.println("前置通知");
    }

修改切面类中 内容如下。

在这里插入图片描述

基于AOP策略模式的实现机制
07-20
本文首先将传统基于OOP策略模式的局限性进行分析说明,提出基本的策略模式以及“链式”策略模式基于AOP的具体实现,解决传统策略模式可能出现的代码分散、代码混乱问题;接着进行复杂度方面的实验对比分析;最后分析...
SpringAOP使用(两种方式)
05-26
NULL 博文链接:https://8366.iteye.com/blog/500500
AOP使用详细讲解)
酷小亚
08-31 1万+
一、AOP基本概念 二、AOP底层原理 三、AOP的JDK动态代理 四、AOP术语 五、AOP操作(准备) 六、AOP操作(AspectJ注解)【重点】 七、AOP操作(AspectJ配置文件)
Spring高手之路18——从XML配置角度理解Spring AOP
最新发布
卓越无关环境,保持空杯心态——靡不有初,鲜克有终
05-12 1万+
本文是全面解析面向切面编程的实践指南。通过深入讲解切面、连接点、通知等关键概念,以及通过XML配置实现Spring AOP的步骤。
(二)AOP基本使用方法
chai0404的博客
02-19 701
Spring AOP基本使用方式
Spring之面向切面(AOP
weixin_74352229的博客
08-17 1276
切点(Pointcut):切点指定了在应用程序中哪些连接点应该被拦截和处理。连接点可以是方法的执行、方法的调用、对象的创建与初始化等。切点可以使用表达式或模式进行定义,以匹配特定的连接点。通知(Advice):通知指定了在切点上要执行的逻辑。通知可以是在切点之前、之后或周围执行。在Spring中,常见的通知类型有前置通知、后置通知、返回通知和异常通知。切面(Aspect):切面是通知和切点的组合。它是代码模块化的单元,它封装了特定关注点的逻辑和行为。切面定义了在哪些切点上应该执行特定的通知。
Spring——AOP基本概念的理解
胜天半子祁同伟
03-10 9175
Spring——AOP基本概念的理解
SpringAOP(图文详解)
热门推荐
lhj520cb的博客
07-16 3万+
Spring实现的AOP是代理模式,给调用者使用的实际是已经过加工的对象,你编程时方法体里只写了A,但调用者拿到的对象的方法体却是xAy。x和y总还是需要你来写的,这就是增强。x和y具体在什么时候被调用总还是需要你来规定的,虽然是基于约定的声明这种简单的规定,这就是切点。
AOP是什么?如何使用AOP
weixin_64572002的博客
06-13 3万+
AOP就是面向切面编程,或者叫面向方面编程,或者开玩笑的说叫面向方便面编程在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。用我的话讲,比如一个方法,他只能计
AOP介绍和使用
薛定谔的猫的博客
07-28 5718
AOP 是⼀种思想,⽽ Spring AOP 是⼀个框架,提供了⼀种对 AOP 思想的实现,它们的关系和 IoC 与 DI 类似。@Slf4j@Component@Aspect//定义切点//定义通知//这里注意,环绕式通知必须自己写返回结果log.info("之前");try{//调用目标方法log.info("之后");return oj;@Aspect是aop框架中提供的,表示是一个切面。
一文弄懂AOP各种概念
wh柒八九的博客
08-28 4874
本文来说下Redis常见使用场景 文章目录概述 概述
什么是AOP
m0_70619994的博客
06-26 5846
AOP(Aspect Oriented Programming)面向切面编程,一种编程范式,指导开发者如何组织程序结构OOP(Object Oriented Programming)面向对象编程作用:在不惊动原始设计的基础上为其进行功能增强。简单的说就是在不改变方法源代码的基础上对方法进行功能增强。Spring理念:无入侵式/无侵入式。
AOPA无人机培训总题库.doc
06-10
AOPA无人机培训总题库是无人机行业中的一份重要的培训资源,涵盖了无人机的基本概念、飞行原理、系统构成、飞控子系统、电气系统、通信系统、导航系统、任务规划等方面的知识点。 1. 近程无人机活动半径在15~50km,...
Spring面试题详细讲解
12-24
Spring面试题详细讲解 Spring 是什么? Spring 是一个轻量级的 IoC 和 AOP 容器框架。是为 Java 应用程序提供基础性服务的框架,目的是简化应用程序的开发主要由以下几个模块组成:Spring Core:核心类库,提供 ...
Api万能路由利用AOP编程思想,指针参数,等来实现任意object-c的API调用
03-17
1、资源内容: Api万能路由利用AOP编程思想,指针参数,等来实现任意object-c的API调用。...3、解压说明:本资源需要电脑端使用WinRAR、7zip等解压工具进行解压,没有解压工具的自行百度下载即可。
关于AOP的介绍和使用
Tripmonster的博客
08-20 951
在运行时,AOP框架会自动生成代理对象,将切面逻辑织入到目标对象的方法中,实现对方法的增强和修改。性能监控:AOP可以用于实现性能监控功能,例如在方法调用前记录方法的开始时间,在方法调用后记录方法的结束时间,并计算方法的执行时间。例如,可以在方法调用前记录方法名和参数,以及在方法调用后记录方法的返回值。日志审计:AOP可以用于实现日志审计功能,例如在方法调用前记录用户的操作,包括操作的类型、时间和操作的对象等。具体来说,它通过AOP的方式,在这些方法执行前后添加额外的逻辑,实现对方法的拦截和处理。
什么是 AOPAOP 的作用是什么?
学一次的博客
04-29 1万+
AOP全称(Aspect Oriented Programming)面向切片编程的简称。AOP面向方面编程基于IoC,是对OOP的有益补充; AOP利用一种称为“横切”的技术,剖解开封装的对象内部,并将那些影响了 多个类的公共行为封装到一个可重用模块,并将其名为“Aspect”,即方面。所谓“方面”,简单地说,就是将那些与业务无关,却为业务模块所共同调用的 逻辑或责任封装起来,比如日志记录,便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可操作性和可维护性。
AOP简介
凉茶铺的博客
02-22 2753
简要的介绍了spring中的AOP使用案例进行了演示
aop面向切面编程面试题
09-03
当谈到AOP(面向切面编程)时,以下是一些常见的面试问题: 1. 什么是AOP?它的用途是什么? 2. AOP和OOP(面向对象编程)之间有什么区别? 3. 在Java中,AOP的实现方式有哪些?请举例说明。 4. 什么是切面(Aspect)?切面由哪些组成? 5. 在AOP中,切点(Pointcut)的作用是什么?如何定义一个切点? 6. 什么是连接点(Joinpoint)?连接点在AOP中的作用是什么? 7. 在AOP中,通知(Advice)有哪些类型?请描述它们的用途。 8. 什么是织入(Weaving)?它在AOP中的作用是什么? 9. 在Spring框架中,如何使用AOP进行方法拦截? 10. AOP的优点和缺点是什么? 这些问题旨在考察你对AOP的理解和实际应用经验。确保你理解AOP基本概念,并能够解释其在软件开发中的重要性和用途。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
写文章

热门文章

  • AOP 的详细说明以及基本的使用 40406
  • 详细分析 vue-admin-template 31863
  • 2019年计算机设计大赛(省赛) 13242
  • hashmap 什么时候转化为红黑树 13112
  • spring boot 中解决 Invalid character found in the request target 异常 12378

分类专栏

  • go 2篇
  • sentinel 1篇
  • Vue 7篇
  • jvm 5篇
  • java 83篇
  • git 1篇
  • dubbo 2篇
  • tomcat 2篇
  • Spring data jpa 4篇
  • spring boot 21篇
  • docker 6篇
  • elasticsearch 3篇
  • 数据结构 5篇
  • linux 6篇
  • java 集合 17篇
  • spring security 3篇
  • Mybatis 6篇
  • rabbitmq 1篇
  • http htps 1篇
  • 设计模式 9篇
  • 剑指offer 7篇
  • Mysql 7篇
  • nginx 5篇
  • spring cloud gateway
  • maven 1篇
  • 递归 9篇
  • CV 2篇
  • 比赛心得 2篇
  • JavaGUI 3篇
  • 算法 16篇

最新评论

  • Python 实现动态人流量计数, 百度AI接口

    崔雨田: 客气了

  • Python 实现动态人流量计数, 百度AI接口

    确实菜: 感谢大佬,这个代码很有借鉴意义

  • hashmap 什么时候转化为红黑树

    王子健121: 应该是如果表的长度小于 64 会先扩容 否则会转为Tree 吧~ TreeNode<K,V> p = replacementTreeNode(e, null);

  • JVM 垃圾回收 之 强引用、弱引用、软引用、虚引用

    navigator2015: 我感觉他说的interner的弱引用方式也有问题啊 虽说 避免了放在字符串常量池,有频繁触发FullGC的问题,但是在内存不足垃圾回收时,不管此时内存够不够,就直接回收了。被回收后 还能锁得住吗

  • 详细分析 vue-admin-template

    Inferno磊: 他这个框架有一个疑惑,sidebarItem组件内也用到了sidebarItem这个当前页面的组件但是可以正常渲染出来,我自己也尝试但是渲染不出来是为什么

大家在看

  • 【干货分享】.NET人脸识别解决方案
  • 小白也能玩转Git:从入门到实战详细教程
  • 【数据结构】【版本1.2】【线性时代】——双向链表
  • PostgreSQL17优化器改进(4)允许UNION(没有ALL)使用MergeAppend 807
  • Spring AOP 注解指南

最新文章

  • Sentinel 原理分析之简单使用
  • git 删除工作区中误添加的文件/文件夹
  • dubbo 的SPI机制Adaptive适配
2023年1篇
2022年1篇
2021年25篇
2020年168篇
2019年10篇

目录

目录

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

PHP网站源码贵阳seo排名哪家好福田营销网站报价来宾企业网站设计多少钱武威网站排名优化天门网站建设设计报价龙华网站优化推荐梅州网站关键词优化宿州关键词按天计费报价云浮优化报价坪地SEO按天计费哪家好阜新企业网站制作公司玉树网站搭建公司唐山模板推广公司定西网站改版价格巴中网站设计西乡关键词按天收费公司诸城优秀网站设计公司宿州百度关键词包年推广报价白山模板网站建设公司白山网页制作推荐南昌网站设计模板推荐济宁百度seo推荐晋中设计网站公司长春百姓网标王推广哪家好随州模板制作哪家好宜昌网站优化按天计费多少钱九江网站设计模板报价株洲SEO按天计费民治网站搭建推荐思茅网站搜索优化歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

PHP网站源码 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化