本文来详细说下@AspectJ中的几种通知方式

文章目录

  • 概述
  • 通知方式说明
  • 一个例子
  • 本文小结

概述

当Spring 2.0发布以后,Spring AOP增加了新的使用方式,Spring AOP集成了AspectJ。我们最常用的就是这个版本的Spring AOP。

主要有如下变化

  • 可以用POJO来定义Aspect和Adivce,并提供了一系列相应的注解,如@Aspect和@Around等。而不用像1.x版本中实现相应的接口
  • 支持aspectj中的pointcut的表达方式,我们都深有体会哈


通知方式说明

下面这个是官网对@AspectJ中的几种通知方式的说明


一个例子

导入@AspectJ注解的maven

<!-- @Aspect--><dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>1.9.7</version></dependency>

选择连接点,就是业务方法,可以看作动态代理中的目标对象

Spring 是方法级别的 AOP 框架,我们主要也是以某个类额某个方法作为连接点,另一种说法就是:选择哪一个类的哪一方法用以增强功能

package cn.wideth.buz.test;public class Landlord {public void service() {// 仅仅只是实现了核心的业务功能System.out.println("业务方法 => service()");
//        throw new RuntimeException();}
}

我们在这里就选择上述 Landlord 类中的 service() 方法作为连接点

创建切面

选择好了连接点就可以创建切面了,我们可以把切面理解为一个拦截器,当程序运行到连接点的时候,被拦截下来,在开头加入了初始化的方法,在结尾也加入了销毁的方法而已,在 Spring 中只要使用 @Aspect 注解一个类,那么 Spring IoC 容器就会认为这是一个切面了。

package cn.wideth.buz.test;import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;/**** 切面(aspect)。类是对物体特征的抽象,* 切面就是对横切关注点的抽象*/
@Aspect
public class Broker {/**** 连接点(joinpoint)。被拦截到的点,因为Spring只* 支持方法类型的连接点,所以在Spring中连接点指的就* 是被拦截到的方法,实际上连接点还可以是字段或者构造器*/@Pointcut("execution(* cn.wideth.buz.test.Landlord.service(..))")public void lService() {}/**** @Before在方法执行之前执行*/@Before("lService()")public void before(){System.out.println("before()");}/**** @After在方法执行之后执行*/@After("lService()")public void after(){System.out.println("after()");}/**** @Around围绕着方法执行*/@Around("lService()")public Object around(ProceedingJoinPoint joinPoint) throws Throwable {System.out.println("<== around");Object result = joinPoint.proceed();System.out.println("around ==>");return result;}/**** @AfterReturning在方法返回结果之后执行*/@AfterReturning("lService()")public void afterReturning(){System.out.println("AfterReturning()");}/**** @AfterThrowing在方法抛出异常之后执行*/@AfterThrowing("lService()")public void afterThrowing(){System.out.println("afterThrowing()");}}

启用AOP

因为使用注解的方式来操作AOP,所以编写一个配置类来开启AOP

package cn.wideth.buz.test;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.EnableAspectJAutoProxy;// 启用AOP
@EnableAspectJAutoProxy
public class AspectJConfig {@Beanpublic Landlord getLandlord() {return new Landlord();}
}

测试 AOP

package cn.wideth.buz.test;import org.springframework.context.annotation.AnnotationConfigApplicationContext;public class Main {public static void main(String[] args) {AnnotationConfigApplicationContext context =new AnnotationConfigApplicationContext(AspectJConfig.class, Broker.class);Landlord landlord = context.getBean(Landlord.class);landlord.service();context.close();}
}

测试结果

Adivce之间的顺序关系

正确的情况下

@Around->@Before->方法执行->@AfterReturning ->@After-> @Around


本文小结

本文介绍了@AspectJ中的几种通知方式,以及5种通知的先后顺序。

@AspectJ中的几种通知方式详解相关推荐

  1. asp.net Session在web.config中的三种配置方式——详解

    这段代码就是设置session在web.config中的存储方式. < sessionState mode="Off|InProc|StateServer|SQLServer" ...

  2. PCBA加工中常见的两种焊接方式详解

    PCBA加工中常见的两种焊接方式详解 PCBA加工,两种常见的焊接方式就是回流焊和波峰焊,与手动焊接技术相比,自动焊接技术具有减少人为因素的影响.提高效率.降低成本.提高质量等优势,在PCBA加工中, ...

  3. @Resource,@Autowired,@Inject3种注入方式详解

    转载自 @Resource,@Autowired,@Inject3种注入方式详解 概况 @Resource,@Autowired,@Inject 这3种都是用来注入bean的,它们属于不同的程序中. ...

  4. C++的三种继承方式详解

    文章目录 @[toc] C++的三种继承方式详解以及区别 前言 一.public继承 二.protected继承 三.private继承 四.三者区别 五.总结 后话 C++的三种继承方式详解以及区别 ...

  5. C语言getline函数CSDN,c++中的两种getline用法详解

    getline是C++标准库函数:但不是C标准库函数,而是POSIX(IEEE Std 1003.1-2008版本及以上)所定义的标准库函数(在POSIX IEEE Std 1003.1-2008标准 ...

  6. JavaScript中this的五种绑定方式详解

    1 this的五种绑定方式 1.1 默认绑定 默认绑定是指当函数调用时,没有为其指定对象上下文,此时会将该函数的this绑定到全局对象(window对象).自ES5有了严格模式之后,默认绑定方式又分为 ...

  7. oracle if=,oracle中if/else的三种实现方式详解

    1.标准sql规范 1.单个IF IF v=... THEN END IF; 2.IF ... ELSE IF v=... THEN ELSE t....; END IF; 3.多个IF IF v=. ...

  8. android中几种定位方式详解

    目录 前言: 1.GPS定位 2.NETWORK定位 3.AGPS定位 4.基站定位 5.WIFI定位 6.混合定位 目前,移动端大致通过三种方式来进行设备定位:GPS.基站.wifi.本文就详细的讲 ...

  9. 单例模式的几种实现方式详解以及原理

    单例模式介绍 前言 这是一个的萌新写的博客,以下是学习课程以后的总结,用于个人的复习与总结,如果有误还请多多包容和指正. 了解单例模式: 单例类只能有一个实例 单例必须创建自己的唯一一个实例 单例类必 ...

最新文章

  1. 平时用到那些linux命令,工作中经常用到的linux命令,你知道多少?
  2. Transaction And Lock--事务中使用return会回滚事务吗?
  3. 产品经理必备知识之网页设计系列(二)-如何设计出一个优秀的界面
  4. 苹果手机透明桌面_打开手机这个设置,桌面变全透明!
  5. 如何启用“锁定内存页”选项 (Windows)
  6. pytorch源码解析2——数据处理torch.utils.data
  7. 给考研迷茫中的你的一封信
  8. linux网络编程之posix线程(二)
  9. 【每日算法Day 92】经典面试题:编辑距离
  10. susue linux防火墙,在64位的SUSUE下,g++编译的代码中,进入函数前的一段汇编让人费解,请高手解释一下?...
  11. Qt编写地图综合应用14-离线地图下载
  12. windows复制文件命令Xcopy
  13. 金额中文大写c语言,C语言编程:数字金额转换为中文大写金额?
  14. .NET EF(Entity Framework)详解
  15. A FastDetectionMethodviaRegion-BasedFullyConvolutionalNeuralNetworksforShieldTunnelLiningDefects-笔记
  16. tkinter 动态显示时间的方法
  17. 软件测试的新技术和方法
  18. POE方案之SI3402-B
  19. DeflateRect
  20. python测试用例发送邮件用谷歌浏览器的方式

热门文章

  1. 从视图到控制器的传值方法(表单)
  2. iOS开发之网络编程--获取文件的MIMEType
  3. 疯狂ios讲义之美化iOS应用
  4. PHP导出excel
  5. 自回归模型/向量自回归模型
  6. 101 LINQ Samples
  7. Archiva 2.2.3 安装运行的时候出现协议版本错误
  8. 关于Javascript 中 setTimeout和setInterval的总结和思考
  9. 2.5. SciTE
  10. 利用SVN的post-commit钩子实现多项目自动同步