gpt4 book ai didi

java - Spring 切入点指示符差异(在 vs 执行中)

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:23:28 25 4
gpt4 key购买 nike

请...任何人都可以解释一下使用以下 spring 切入点指示符之间的区别是什么吗?

使用“在切入点指示符内”:

<aop:pointcut expression="within(my.app.dao.impl.*)" id="commonDaoOperation"/>

使用“执行切入点指示符”:

<aop:pointcut expression="execution(public * my.app.dao.impl.*.*(..))" id="commonDaoOperation"/>

我在我的网络项目中使用了第二种(我认为它是最常用的),我发现这种方法的问题是它在堆中消耗了大量内存......

在使用“eclipse 内存分析器”分析应用服务器的“堆转储”后,我发现我的应用程序消耗了 450 MB 和 “org.springframework.aop.aspectj.AspectJExpressionPointcut”类的实例”正在消耗这 450MB 中的 30%...

AspectJExpressionPointcut 的每个实例占用 6 MB(大约),这是因为每个实例都保留了一个与 java.lang.reflect.Method 实例匹配的缓存,令人惊讶的是有很多 java 方法缓存(我的切入点表达式没有提到的方法)。

阅读 Spring 文档后,我决定使用第一种方法(在切入点指示符内),现在 AspectJExpressionPointcut 的每个实例占用更少的内存。

问题是关于...它们之间的性能差异是什么...

提前致谢...

最佳答案

Spring documentation解释区别:

  • execution - for matching method execution join points, this is the primary pointcut designator you will use when working with Spring AOP
  • within - limits matching to join points within certain types (simply the execution of a method declared within a matching type when using Spring AOP)

换句话说,execution 匹配一个方法,within 匹配一个类型。

在这种情况下,您的切入点几乎是等效的。您的 within 匹配包 my.app.dao.impl 中的任何类型并且您的 execution 匹配包中任何类型的所有公共(public)方法我的.app.dao.impl

然而,execution 是实现的,我认为,每个匹配的方法(很多对象)都有一个拦截器,within 只需要一个拦截器,因为它匹配整个类型(非常小的对象)。

关于java - Spring 切入点指示符差异(在 vs 执行中),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20816780/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com