java - @Around 在 Spring Boot AOP 中的 @After、@Before、@AfterReturning 组合
问题描述
我们可以说spring boot AOP中的@Around注解是@Before和@After方法的组合。
@Around("myPointCut()")
public Object applicationLogger(ProceedingJoinPoint joinPoint){
logger.info(" for the Method : " + joinPoint.getSignature().getName() +
" Request received : {}", Arrays.toString(joinPoint.getArgs()));
Object res = null;
try {
res = joinPoint.proceed();
logger.info(" for the Method :"+ joinPoint.getSignature().getName() +
" Response received : {}", res);
} catch (Throwable throwable) {
throwable.printStackTrace();
}
return res;
}
使用带有@Around 注释的通知方法,我们可以获取输入参数以及使用proceed() 创建一个代理演示类并调用实际实现的方法的返回对象。如果假设我们没有@Around 注解,那么我们将不得不使用@Before 和@After 注解以及两个单独的方法来实现输入和输出参数。
所以我们可以说只是@Around 注释就足够了,我们不需要@Before、@After、@AfterReturning 注释,因为这些都由@Around 提供。
解决方案
你说的对。基本上,对于应用了多个@Before
、和建议的方法@After
,可以将其转换为单个建议。@AfterReturing
@AfterThrowing
@Around
主要区别在于它@Around
是一种更通用的建议类型,可为您提供最大的灵活性。您可以完全控制如何在方法调用上应用建议,而其他更具体的建议类型为您提供了执行此类操作的声明性方法(例如@Order
,用于定义执行顺序)。因此,如果您喜欢以命令式(即@Around
)或声明式方式执行此操作,这只是一个问题。
并且spring文档也有一些关于如何在它们之间进行选择的评论。我根据您的问题的上下文对它们进行了如下修改:
@Around
提供与其他符合 AOP 联盟的 AOP 实现的互操作性。另一个更具体的通知类型实现了常见的 AOP 概念,但是以 Spring 特定的方式。虽然使用最具体的通知类型有优势,但@Around
如果您可能希望在另一个 AOP 框架中运行方面,请坚持使用通知。
更具体的建议的主要优点是不需要调用该
proceed()
方法,因此,不可能在拦截器链中无意中失败。
推荐阅读
- c# - 在 StreamWriter 前面使用“使用”
- c# - 尽可能快地在 DataTable 中找到匹配的记录
- php - nginx 错误:图像的 openat() 失败(20:不是目录)
- javascript - 设置页面谷歌分析
- oauth - 如何为访问 API 的第三方 Web 应用程序存储 API 密钥
- python - 为什么这个 dict 在 python 代码中不可迭代,但在 django 模板中可迭代?
- javascript - 如何从 reducer 修改 redux store 的状态
- html - 未添加复选框及其标签之间的空间
- c# - 如何在mysql存储过程中返回输出参数
- php - 您可以从位于单个结果集中的两个单独的表中提取数据吗?[不加入问题]