Java 弹簧切入点指示器差异(与执行内)

Java 弹簧切入点指示器差异(与执行内),java,spring,spring-aop,pointcut,Java,Spring,Spring Aop,Pointcut,请。。。有谁能解释一下使用以下spring切入点指示器之间的区别吗 使用“切入点指示器内”: 使用“执行切入点指示器”: 我在我的web项目中使用了第二种方法(我认为它是使用最多的),我发现这种方法的问题是它在堆中消耗了大量内存 在使用“eclipse内存分析器”分析应用服务器的“堆转储”后,我发现我的应用程序消耗了450MB,而类“”org.springframework.aop.aspectj.AspectJExpressionPointcut”的实例消耗了450MB中的30% As

请。。。有谁能解释一下使用以下spring切入点指示器之间的区别吗

使用“切入点指示器内”:


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


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

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

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

在阅读了Spring文档之后,我决定使用第一种方法(在切入点指示器中),现在
AspectJExpressionPointcut
的每个实例占用的内存要少得多

问题是关于。。。他们的表现有什么不同

非常感谢您的光临……

解释了不同之处:

  • 执行-对于匹配方法执行连接点,这是使用Spring AOP时将使用的主要切入点指示器
  • 内-限制匹配到特定类型内的连接点(仅当 使用Spring(AOP)
换句话说,
执行
匹配一个方法,
中的
匹配一个类型

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

然而,
执行
是为每个匹配的方法(很多对象)使用一个拦截器来实现的,在
中,
只需要一个拦截器,因为它匹配整个类型(很少的对象)。

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

谢谢Sotirios Delimanolis,我可以毫无问题地将它们一起使用吗?最近,我更改了配置,将它们一起使用(在和执行中)。。。类似于以下内容:“@glazaror将它们一起使用没有任何实际意义。
中的
已经匹配了
执行过程中的所有内容。。。在我的“用例”中,“AspectJExpressionPointcut”的实例是内存消耗的问题,因为“执行切入点指示符”。。。将其更改为“切入点指示器内”可减少该问题。因此。。。在某些用例中,在切入点指示符中使用它会被认为更好吗?
<aop:pointcut expression="within(my.app.dao.impl.*)" id="commonDaoOperation"/>
<aop:pointcut expression="execution(public * my.app.dao.impl.*.*(..))" id="commonDaoOperation"/>