15

请...有人可以解释一下使用以下弹簧切入点指示符有什么区别吗?

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

<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占用的内存要少得多。

问题是关于那个......他们之间的表现有什么区别......

提前谢谢了...

4

2 回答 2

8

Spring 文档解释了差异:

  • execution - 用于匹配方法执行连接点,这是您在使用 Spring AOP 时将使用的主要切入点指示符
  • 范围内- 限制匹配到某些类型内的连接点(使用 Spring AOP 时仅执行在匹配类型内声明的方法)

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

在这种情况下,您的切入点几乎是等价的。你within匹配包中的任何类型,my.app.dao.implexecution匹配包中任何类型的所有公共方法my.app.dao.impl

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

于 2013-12-28T16:38:17.880 回答
1

execution() 匹配作为方法执行的连接点。这是唯一实际执行匹配的指示符。所有其他指示符(由 Spring AOP 支持)仅限制这些匹配。请注意,Spring 仅支持 AspectJ 中可用的指示符子集(Spring AOP 是基于代理的)。Spring 支持的 AspectJ 切入点指示符有:args() 和@args()、target() 和@target()、within() 和@within()、execution()、this()、@annotation

于 2019-02-02T17:57:39.573 回答