请...有人能解释一下使用以下弹簧切入点指示符之间有什么区别吗?
使用"切入点指示符":
<aop:pointcut expression="within(my.app.dao.impl.*)" id="commonDaoOperation"/>
Run Code Online (Sandbox Code Playgroud)
使用"执行切入点指示符":
<aop:pointcut expression="execution(public * my.app.dao.impl.*.*(..))" id="commonDaoOperation"/>
Run Code Online (Sandbox Code Playgroud)
我在我的web项目中使用第二个(我认为它是最常用的),我用这种方法发现的问题是它在堆中消耗了大量内存......
在使用"eclipse内存分析器"分析应用程序服务器的"堆转储"后,我发现我的应用程序消耗了450 MB,并且该类的实例"org.springframework.aop.aspectj.AspectJExpressionPointcut"正在消耗这些450 MB的30%......
每个实例AspectJExpressionPointcut占用6 MB(大约),这是因为每个实例都保留了与java.lang.reflect.Method实例匹配的缓存,并且令人惊讶的是有很多java方法被缓存(我的切入点表达式没有提到的方法).
在阅读Spring Documentation之后,我决定使用第一种方法(在切入点指示符内),现在每个实例AspectJExpressionPointcut占用的内存都少得多.
问题是关于......他们之间的表现有什么不同......
提前谢谢了...