gla*_*ror 10 java spring spring-aop pointcut
请...有人能解释一下使用以下弹簧切入点指示符之间有什么区别吗?
使用"切入点指示符":
<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占用的内存都少得多.
问题是关于......他们之间的表现有什么不同......
提前谢谢了...
在Spring文档解释了区别:
- 执行 -用于匹配方法执行连接点,这是在使用Spring AOP时将使用的主要切入点指示符
- 内 -限制匹配某些类型内的连接点(仅在使用Spring AOP时在匹配类型内声明的方法的执行)
换句话说,execution匹配一个方法并within匹配一个类型。
在这种情况下,切入点几乎是等效的。您within匹配包中的任何类型,my.app.dao.impl并且execution匹配包中任何类型的所有公共方法my.app.dao.impl。
但是,execution我认为,对于每个匹配的方法(很多对象),都有一个拦截器实现,within因为它与整个类型(很少的对象)匹配,所以只需要一个拦截器。
| 归档时间: |
|
| 查看次数: |
9265 次 |
| 最近记录: |