AOP如何实现及实现原理

概述:

最近在开发中遇到了一个刚好可以用AOP实现的例子,就顺便研究了AOP的实现原理,把学习到的东西进行一个总结。文章中用到的编程语言为kotlin,需要的可以在IDEA中直接转为java。 这篇文章将会按照如下目录展开:

  • AOP简介
  • 代码中实现举例
  • AOP实现原理
  • 部分源码解析

1. AOP简介

相信大家或多或少的了解过AOP,都知道它是面向切面编程,在网上搜索可以找到很多的解释。这里我用一句话来总结:AOP是能够让我们在不影响原有功能的前提下,为软件横向扩展功能。 那么横向扩展怎么理解呢,我们在WEB项目开发中,通常都遵守三层原则,包括控制层(Controller)->业务层(Service)->数据层(dao),那么从这个结构下来的为纵向,它具体的某一层就是我们所说的横向。我们的AOP就是可以作用于这某一个横向模块当中的所有方法。

我们在来看一下AOP和OOP的区别:AOP是OOP的补充,当我们需要为多个对象引入一个公共行为,比如日志,操作记录等,就需要在每个对象中引用公共行为,这样程序就产生了大量的重复代码,使用AOP可以完美解决这个问题。

接下来介绍一下提到AOP就必须要了解的知识点:

  • 切面:拦截器类,其中会定义切点以及通知
  • 切点:具体拦截的某个业务点。
  • 通知:切面当中的方法,声明通知方法在目标业务层的执行位置,通知类型如下:
    1. 前置通知:@Before 在目标业务方法执行之前执行
    2. 后置通知:@After 在目标业务方法执行之后执行
    3. 返回通知:@AfterReturning 在目标业务方法返回结果之后执行
    4. 异常通知:@AfterThrowing 在目标业务方法抛出异常之后
    5. 环绕通知:@Around 功能强大,可代替以上四种通知,还可以控制目标业务方法是否执行以及何时执行

2. 代码中实现举例

上面已经大概的介绍了AOP中需要了解的基本知识,也知道了AOP的好处,那怎么在代码中实现呢?给大家举个例子:我们现在有个学校管理系统,已经实现了对老师和学生的增删改,又新来个需求,说是对老师和学生的每次增删改做一个记录,到时候校长可以查看记录的列表。那么问题来了,怎么样处理是最好的解决办法呢?这里我罗列了三种解决办法,我们来看下他的优缺点。

 

-最简单的就是第一种方法,我们直接在每次的增删改的函数当中直接实现这个记录的方法,这样代码的重复度太高,耦合性太强,不建议使用。

-其次就是我们最长使用的,将记录这个方法抽离出来,其他的增删改调用这个记录函数即可,显然代码重复度降低,但是这样的调用还是没有降低耦合性。

-这个时候我们想一下AOP的定义,再想想我们的场景,其实我们就是要在不改变原来增删改的方法,给这个系统增加记录的方法,而且作用的也是一个层面的方法。这个时候我们就可以采用AOP来实现了。

我们来看下代码的具体实现:

  1. 首先我定义了一个自定义注解作为切点
@Target(AnnotationTarget.FUNCTION)  //注解作用的范围,这里声明为函数
@Order(Ordered.HIGHEST_PRECEDENCE)  //声明注解的优先级为最高,假设有多个注解,先执行这个
annotation class Hanler(val handler: HandlerType)  //自定义注解类,HandlerType是一个枚举类型,里面定义的就是学生和老师的增删改操作,在这里就不展示具体内容了
复制代码
  1. 接下来就是要定义切面类了
@Aspect   //该注解声明这个类为一个切面类
@Component
class HandlerAspect{

 @Autowired
 private lateinit var handlerService: HandlerService

@AfterReturning("@annotation(handler)")   //当有函数注释了注解,将会在函数正常返回后在执行我们定义的方法
fun hanler(hanler: Hanler) {
    handlerService.add(handler.operate.value)   //这里是真正执行记录的方法
}
}
复制代码
  1. 最后就是我们本来的业务方法了
/**
* 删除学生方法
*/
@Handler(operate= Handler.STUDENT_DELETE)   //当执行到删除学生方法时,切面类就会起作用了,当学生正常删除后就会执行记录方法,我们就可以看到记录方法生成的数据
fun delete(id:String) {
   studentService.delete(id)
}
复制代码

3. AOP实现原理

我们现在了解了代码中如何实现,那么AOP实现的原理是什么呢?之前看了一个博客说到,提到AOP大家都知道他的实现原理是动态代理,显然我之前就是不知道的,哈哈,但是相信阅读文章的你们一定是知道的。

讲到动态代理就不得不说代理模式了, 代理模式的定义:给某一个对象提供一个代理,并由代理对象控制对原对象的引用。代理模式包含如下角色:subject:抽象主题角色,是一个接口。该接口是对象和它的代理共用的接口; RealSubject:真实主题角色,是实现抽象主题接口的类; Proxy:代理角色,内部含有对真实对象RealSubject的引用,从而可以操作真实对象。代理对象提供与真实对象相同的接口,以便代替真实对象。同时,代理对象可以在执行真实对象操作时,附加其他的操作,相当于对真实对象进行封装。如下图所示:

 

 

那么代理又分为静态代理和动态代理,这里写两个小的demo,动态代理采用的就是JDK代理。举个例子就是现在一个班上的学生需要交作业,现在由班长代理交作业,那么班长就是代理,学生就是被代理的对象。

3.1 静态代理

首先,我们创建一个Person接口。这个接口

查漏补bug
关注 关注
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
AOP实现机制
执着之道
10-18 530
附件中有本文的源代码和Pdf版。本文写的很长的原因,是不希望大家学习AOP时到处找资料,大家有时间可以按照本文动手实践下,相信会有非常大的收获的,有什么问题互相交流,有问必答! 1 AOP各种的实现     AOP就是面向切面编程,我们可以从几个层面来实现AOP。 在编译器修改源代码,在运行期字节码加载前修改字节码或字节码加载后动态创建代理类的字节码,以下是各种实现机制的比较。    ...
spring aop实现原理
03-15
NULL 博文链接:https://zhang-yingjie-qq-com.iteye.com/blog/319927
Java:由浅入深揭开 AOP 实现原理
Java笔记虾
11-18 1087
概述: 最近在开发中遇到了一个刚好可以用AOP实现的例子,就顺便研究了AOP实现原理,把学习到的东西进行一个总结。文章中用到的编程语言为kotlin,需要的可以在IDEA中直接转为java。 这篇文章将会按照如下目录展开: AOP简介 代码中实现举例 AOP实现原理 部分源码解析 1. AOP简介 相信大家或多或少的了解过AOP,都知道它是面向...
AOP实现的三种方式
weixin_45264992的博客
04-20 7930
AOP实现的三种方式 说说为什么要使用AOP编程: AOP(面向切面编程)是OOP(面向对象编程)发展而来,在OOP编程中,每一个对象都有自己特定的功能,但是如果我们需要引入公共的功能时候,那么如果继续使用OOP编程思想的话,就会导致大量代码重用,而不利于模块的重用。而AOP编程则是将一些公共业务封装起来,为每一个需要使用这些公共业务的对象提供相应业务(通过代理实现)。一般将公共业务封装起来的类就是切面类,也就是我们切面编程所说的切面。 下面我们给对象添加一个公共业务:日志输出。 即在方法执行前后都在控制台
AOP实现原理
Mr.BoBo的博客
08-21 2836
AOP原理 简介 AOP(Aspect-OrientedProgramming)面向切面编程,可以理解为OOP的改进和完善,其编程思想是把散布于不同业务但功能相同的代码从业务逻辑中抽取出来,封装成独立的模块,这些独立的模块被称为切面,切面的具体功能方法被称为关注点。在业务逻辑执行过程中,AOP会把分离出来的切面和关注点动态切入到业务流程中,这样做的好处是提高了功能代码的重用性和可维护性。 AOP的相关术语: Joinpoint:连接点,可以被拦截到的点 Pointcut:切入点,真正被拦截到的点 Ad
AOP的应用以及代码实现(详细剖析)
我是老伯的博客
02-20 2199
AOP的应用以及代码实现(详细剖析)
深入浅析Spring 的aop实现原理
09-02
AOP(Aspect-OrientedProgramming,面向方面编程),可以说是OOP(Object-Oriented Programing,面向对象编程)的补充和完善。本文给大家介绍Spring 的aop实现原理,感兴趣的朋友一起学习吧
Spring AOP实现原理详解及实例
10-19
主要介绍了Spring AOP实现原理详解及实例的相关资料,需要的朋友可以参考下
Spring AOP实现原理解析
08-28
Spring AOP实现原理解析 Spring AOP(Aspect-Oriented Programming)是一种面向方面编程的技术,它可以将公共行为封装到一个可重用模块中,以减少系统的重复代码,降低模块间的耦合度,并有利于未来的可操作性和可...
aop实现原理_动力节点Java学院整理
10-19
主要介绍了aop实现原理,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
Springaop原理及各种应用场景
01-27
AOP是...实现的关键就在于AOP框架自动创建的AOP代理,AOP代理则可分为静态代理和动态代理两大类,其中静态代理是指使用 AOP框架提供的命令进行编译,从而在编译阶段就可生成AOP代理类,因此也称为编译
springIOC及AOP底层原理Demo实现
最新发布
11-13
实现spring框架中两大思想: 1.ioc 2.aop 分析实现原理自己实现ioc和aop
AOP实现原理.jpg
09-08
java AOP实现原理.jpg
代理机制及AOP原理实现
04-01
spring中动态代理机制的实现原理AOP实现原理,JDK的反射,cglib类。
Spring AOP + 注解实现统一注解功能
08-27
"Spring AOP + 注解实现统一注解功能" 本文我们通过Spring AOPJava的自定义注解来实现日志的插入功能,该方案对原有业务入侵较...通过本文,我们可以学习到Spring AOPJava注解的使用,并了解日志处理的实现原理
【Spring】AOP实现原理(一):AOP基础知识
S-H_A-N
05-07 302
AOP相关概念 在学习AOP实现原理之前,先了解下AOP相关基础知识。 AOP面向切面编程,它可以通过预编译方式或者基于动态代理对我们编写的代码进行拦截(也叫增强处理),在方法执行前后可以做一些操作,一般我们会看到以下几个概念: 连接点(JointPoint): AOP进行切入的位置称为连接点,一般指程序中的某个方法,对该方法进行拦截 通知(Advice): 在某个连接点执行的操作称为通知,也就是被拦截方法执行前后需要执行的操作称为通知,一共有五种 前置通知:作用于被拦截方法执行之前 后置通知:作用于被拦
什么是AOP,如何实现?(有落地代码)
java小白翻身
05-25 1699
好的,下面是 AOP 的总结:AOP(Aspect-Oriented Programming)是一种编程范式,它通过将横切关注点(如日志记录、事务管理等)从业务逻辑中分离出来,以模块化的方式实现这些关注点。AOP 的核心思想是将程序的功能分解成不同的关注点,然后通过切面将这些关注点模块化,从而提高代码的可维护性和可重用性。AOP 的主要概念包括:切面(Aspect):横切关注点的模块化,它包括切点和通知。切点(Pointcut):程序中需要被拦截的方法或者类。
aop实现原理
冰蛙
07-30 400
首先通过aop配置切面以及切面的增强逻辑,当spring的容器中目标类的对象的方法被调用时,aop框架就会拦截此次调用,aop框架会帮你生成一个动态代理对象,先运行增强类中的前置增强方法,再运行原业务类的业务方法,最后再运行增强类的后置增强方法 注意:aop默认通过jdk提供的proxy来生成动态代理对象,但是也可以手动指定使用cglib来生成动态代理对象 ...
springaop实现原理
05-10
Spring AOP实现原理主要是基于动态代理,它通过代理对象来控制访问目标对象的过程。当我们在应用中使用AOP时,Spring会在运行时动态地创建一个代理对象,该代理对象包含了目标对象的所有方法,并且可以在目标对象的...

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

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

热门文章

  • 解析 Golang 协程池 gopool 设计与实现 2279
  • AOP如何实现及实现原理 1897
  • JAVA常用框架SQL注入审计 1675
  • 十年架构师告诉你怎样写好接口文档 1552
  • Kitex 框架入门系列(1) 1545

最新评论

  • 阿里跳槽来的,连Spring容器与SpringMVC的容器的区别都不知道

    qq_41879225: 讲的太棒了,醍醐灌顶

  • Kitex 框架入门系列(1)

    YongApple: 很好的分析; 多谢分享

大家在看

  • 深入理解指针(2) 400
  • 【Android】构建 Android Automotive OS:适合初学者的指南 746
  • JINGWHALE ABCDE 概念模型系统设计建模法,用户画像进行场景化业务需求分析与归纳,帮你规范系统产品业务模型梳理 ,打造全链路的产品体验! 1325
  • 中央空调水系统安装
  • Java实现简易聊天室 “YouChat” 740

最新文章

  • Java 14 令人期待的 5 大新特性,打包工具终于要来了
  • 设计模式之代理模式
  • Golang Mutex 原理解析
2022年29篇

目录

目录

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值

深圳SEO优化公司盐田网站优化按天计费大芬模板网站建设福田阿里店铺运营盐田百搜标王观澜网站推广广州优秀网站设计同乐外贸网站设计民治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次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

深圳SEO优化公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化