spring aop用法_概念的种类

spring aop用法_概念的种类SpringAOP入门——概念及注意点

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

AOP是什么?


AOP从功能上来说就是在执行某些业务逻辑的前后,可以允许你动态地添加一些操作(比如记录日志、或者是判断是否有权限等),这些操作的添加,完全不耦合于原来的业务逻辑,从而对原有业务逻辑完全是透明。

也就是说,这段操作和业务逻辑是完全分开的,它可能在项目中需要横切多个模块,且其自身也是一个独立的模块,贯穿了整个项目。我们完全可以根据需要启用或者停用这个功能。 AOP的典型应用就是事务管理和日志。

AOP中的概念


下面这些术语并不是Spring定义的。由于AOP中的术语不是那么形象,所以如果Spring再自己定义一套的话那么会使得这些概念更加混淆。

a) 切面(Aspect):一个横切关注点的模块化。在企业级JAVA应用中,事务管理是一个关于横切关注点的典型例子。在Spring AOP中,切面可以用常规类(基于shcema)或者用常规类并加上注解来实现(基于@AspectJ)。

b) 通知(Advice):由切面在特定的连接点执行的动作称为通知。不同类型的通知包括,前置通知、环绕通知、后置通知等。许多AOP框架,包括Spring,把通知模拟成一个拦截器,环绕着连接点维护一个拦截器链。

c) 连接点(JoinPoint):程序运行过程中的一个点,比如说执行方法或者是处理异常。在Spring Aop中,一个连接点总是代表一个方法的执行。

d) 目标对象(Target Object):也就是需要被通知的对象,所以也叫被通知对象(advised object)。由于Spring AOP是用运行时代理来实现的,所以这个对象总是个被代理的对象。

e) AOP代理(AOP proxy):AOP框架创建用来实现实现AOP功能的。在Spring框架中,AOP代理可以基于JDK动态代理,也可以是基于CGLIB的代理。

f) 织入(Weaving):把切面和其它应用类型或者对象来创建一个目标对象。可以在编译期(比如使用 AspectJ编译器),装载阶段或者是运行时完成。正如别的纯JavaAOP框架一样,Spring AOP在运行时实现织入。


通知类型


a) 前置通知(Before advice):在连接点之前执行,但是无法阻止连接点的执行(除非其中抛出异常)

b) 后置返回通知(After returning advice):在连接点正常执行完成后执行,比如一个方法正常返回且没有抛出异常

c) 后置异常通知(After throwing advice):在被通知方法抛出异常后执行

d) 后置通知(After (final) advice):只要连接点执行那就一定会执行,不管是抛出异常还是正常返回

e) 环绕通知(Around advice):这是最强大的通知,它可以实现前置通知和后置通知,并且它还可以来控制①是否执行连接点②返回值③抛异常

环绕通知是最常见的一种通知。Spring AOPAspectJ一样提供了全范围的通知类型,所以官方文档给出的建议是使用“最弱小”的通知来实现我们的需求,为什么呢?你懂的,杀鸡焉用牛刀,且复杂的东西容易出错。比如,如果你只需要使用方法的返回值更新一下缓存,虽然环绕通知也可以满足这一要求,但使用一个后置返回通知将要比使用一个环绕通知要好。使用最合适的通知类型会让你的编程模型变的简单,从而避免一些潜在的错误。比如,你不需要去调用ProceedingJoinPointproceed()方法,因此你不会因为调用它而出错。

连接点的概念和切入点一样,都是AOP的核心。它们让AOP区别于更老的一些只提供拦截器的技术。切入点能把通知指向到目标,而不必局限于OOP的结构。比如,环绕通知可以对那些横跨多个对象的方法(比如服务层的所有业务方法)提供事务管理。


需要注意的地方


1、若存在around,且around未proceed目标方法,那么after则不会被触发

2、若存在around,且proceed目标方法抛出异常,那么proceed之后的语句就不会执行到,而是直接到after or after returing

3、若存在around,且around正常执行,那么around方法的返回值,也就是在after-returning中能够获得的返回值

4、若不存在around,那么after-returning能够获得的返回值就是目标方法执行后的返回值

5、around就算不给返回值,也不会妨碍目标方法的调用,并不像网上说的那样会导致目标方法停止调用并返回null

6、事务是与线程绑定的,若在方法中开启新线程,那么自然独立于先前的事务

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/169614.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 前端学到什么程度可以找到工作(应届毕业生有什么优势)

    目录1.前端开发下载安装VScode优化配置2、插件安装3、设置字体大小4、开启完整的Emmet语法支持5、视图2.Node.js入门2.1、什么是Node.js2.2、Node.js有什么用2.3、安装下载:2.4、快速入门2.5、服务器端应用开发3、ES6入门3.2、let声明变量3.3、const声明常量3.4、解构赋值创建3.5、模板字符串创建3.6、声明对象简写创建3.7、定义方法简写3.8、对象拓展

    2022年4月16日
    44
  • Mozilla Firefox 67.0 Beta 8 (Quantum) 发布

    Mozilla Firefox 67.0 Beta 8 (Quantum) 发布

    2021年7月4日
    104
  • 小众网java下载_jar应用下载

    小众网java下载_jar应用下载全版本都有包含:windows、Linux、源码等,根据名称进行挑选、下载!网址:https://jbossas.jboss.org/downloads/如何解决了您的问题,欢迎关注我!还希望来JAVAWEB开发交流群:958923746,有问题欢迎共享,共同提升!…

    2022年10月3日
    0
  • MQTT(一)C#使用 MQTTnet 快速实现 MQTT 通信(文末有完整Demo下载)[通俗易懂]

    MQTT(一)C#使用 MQTTnet 快速实现 MQTT 通信(文末有完整Demo下载)[通俗易懂]目录MQTT(一)C#使用MQTTnet快速实现MQTT通信(文末有完整Demo下载)MQTT(二)在windows64位上安装Python环境MQTT(三)Python客户端+net客户端+net服务端简单通信MQTT(四)树莓派开机自动运行Python客户端MQTT(五)EMQ开源MQTT消息服务器1什么是MQTT?MQTT(MessageQue…

    2022年6月25日
    288
  • swagger @ApiModel @ApiModelProperty注解属性说明「建议收藏」

    @ApiModel使用场景:在实体类上边使用,标记类时swagger的解析类。概述:提供有关swagger模型的其它信息,类将在操作中用作类型时自动内省。用法:@ApiModel(value=“ShopVo”,description=“商铺信息”)@ApiModelProperty使用场景:使用在被@ApiModel注解的模型类的属性上。表示对model属性的说明或者数据操作更改。概述:添加和操作模型属性的数据。用法:@ApiModelProperty(value=“

    2022年4月14日
    857
  • java子窗口获取父窗口句柄_java获得窗口句柄[通俗易懂]

    java子窗口获取父窗口句柄_java获得窗口句柄[通俗易懂]学会用按键精灵获取子窗口句柄来源:按键学院【按键精灵】电脑的桌面是最顶级的…Windows通过句柄(Handle)识别每个窗体、控件、菜单和菜单项,当程序运行时,它所包含的每个部件都有一个惟一确定的句柄同其他的部件相区别句柄在WindowsAPI中具有举足……其实呢,“抓抓”抓句柄的功能,实现起来是很容易的,我们一起来操作看看。实现功能点击图片控件之后鼠标不松开,到了需要…

    2022年7月14日
    17

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号