@AspectJ中的几种通知方式详解
本文来详细说下@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中的几种通知方式详解相关推荐
- asp.net Session在web.config中的三种配置方式——详解
这段代码就是设置session在web.config中的存储方式. < sessionState mode="Off|InProc|StateServer|SQLServer" ...
- PCBA加工中常见的两种焊接方式详解
PCBA加工中常见的两种焊接方式详解 PCBA加工,两种常见的焊接方式就是回流焊和波峰焊,与手动焊接技术相比,自动焊接技术具有减少人为因素的影响.提高效率.降低成本.提高质量等优势,在PCBA加工中, ...
- @Resource,@Autowired,@Inject3种注入方式详解
转载自 @Resource,@Autowired,@Inject3种注入方式详解 概况 @Resource,@Autowired,@Inject 这3种都是用来注入bean的,它们属于不同的程序中. ...
- C++的三种继承方式详解
文章目录 @[toc] C++的三种继承方式详解以及区别 前言 一.public继承 二.protected继承 三.private继承 四.三者区别 五.总结 后话 C++的三种继承方式详解以及区别 ...
- C语言getline函数CSDN,c++中的两种getline用法详解
getline是C++标准库函数:但不是C标准库函数,而是POSIX(IEEE Std 1003.1-2008版本及以上)所定义的标准库函数(在POSIX IEEE Std 1003.1-2008标准 ...
- JavaScript中this的五种绑定方式详解
1 this的五种绑定方式 1.1 默认绑定 默认绑定是指当函数调用时,没有为其指定对象上下文,此时会将该函数的this绑定到全局对象(window对象).自ES5有了严格模式之后,默认绑定方式又分为 ...
- 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=. ...
- android中几种定位方式详解
目录 前言: 1.GPS定位 2.NETWORK定位 3.AGPS定位 4.基站定位 5.WIFI定位 6.混合定位 目前,移动端大致通过三种方式来进行设备定位:GPS.基站.wifi.本文就详细的讲 ...
- 单例模式的几种实现方式详解以及原理
单例模式介绍 前言 这是一个的萌新写的博客,以下是学习课程以后的总结,用于个人的复习与总结,如果有误还请多多包容和指正. 了解单例模式: 单例类只能有一个实例 单例必须创建自己的唯一一个实例 单例类必 ...
最新文章
- 平时用到那些linux命令,工作中经常用到的linux命令,你知道多少?
- Transaction And Lock--事务中使用return会回滚事务吗?
- 产品经理必备知识之网页设计系列(二)-如何设计出一个优秀的界面
- 苹果手机透明桌面_打开手机这个设置,桌面变全透明!
- 如何启用“锁定内存页”选项 (Windows)
- pytorch源码解析2——数据处理torch.utils.data
- 给考研迷茫中的你的一封信
- linux网络编程之posix线程(二)
- 【每日算法Day 92】经典面试题:编辑距离
- susue linux防火墙,在64位的SUSUE下,g++编译的代码中,进入函数前的一段汇编让人费解,请高手解释一下?...
- Qt编写地图综合应用14-离线地图下载
- windows复制文件命令Xcopy
- 金额中文大写c语言,C语言编程:数字金额转换为中文大写金额?
- .NET EF(Entity Framework)详解
- A FastDetectionMethodviaRegion-BasedFullyConvolutionalNeuralNetworksforShieldTunnelLiningDefects-笔记
- tkinter 动态显示时间的方法
- 软件测试的新技术和方法
- POE方案之SI3402-B
- DeflateRect
- python测试用例发送邮件用谷歌浏览器的方式