- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
在我的例子中,我使用了以下建议
:
@Around(value = "@annotation(MyAnnotation) && args(MyArgs)")
一旦将 MyAnnotation 添加到方法中,它就可以正常工作,并且 MyArgs
也将被检索。
@MyAnnotation(type = MyType.CREATE)
public void add(MyArgs) {
...
}
但是在这个post ,它说:
The errors that can and will occur
Using only annotations creates another problem that we don’t need to think about while using patterns; It will make our advice run twice(or more), because the annotation pointcut don’t specify if it should be run during execution or initialization.
根据我的理解,一旦到达 join point
并且满足条件,建议应该运行(然后我上面的 advice 将运行两次 - < em>调用 和执行)。我应该使用以下建议来避免它。
@Around(value = "@annotation(MyAnnotation) && execution(* *(..)) && args(MyArgs)")
但是我调试了我的代码,它只运行一次而没有添加execution(* *(..))
。
这样对吗?或者这不是 advice
运行的方式?
@Nandor 是对的,我使用的是 Spring AOP 而不是 AspectJ。我启动了一个 maven demo清楚地表明了他的观点。谢谢你,南多尔。
最佳答案
如果您使用的是 AspectJ,您的建议将被触发两次,因为切入点表达式
@annotation(MyAnnotation)
匹配方法执行 和方法调用 连接点。参见 call vs execution在 AspectJ 编程指南中。由于您的切入点表达式不限于调用 或执行 连接点,因此它将匹配两者。如果您实际上在您的项目中使用了 AspectJ,那么您的 around advice 将被触发,并且您将面临您在您所指的帖子中被警告的问题。
事实上,使用这个切入点表达式不会导致周围建议执行两次,这意味着您实际上没有使用 AspectJ,而是使用 Spring AOP,它只支持方法执行切入点(参见 Spring AOP capabilities and goals)
Spring AOP currently supports only method execution join points (advising the execution of methods on Spring beans).
并且仅适用于公共(public)方法,因为 Spring AOP 的基于代理的性质(除了许多其他限制)。
如果要创建与 Spring AOP 和 AspectJ 行为相同的切入点表达式,请确保始终通过添加相应的切入点表达式将切入点约束为方法执行,例如:
@annotation(MyAnnotation) && execution(public * *(..))
关于JAVA advice annotation 会运行两次吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49786603/
我已经创建了自定义注释: @Target({ElementType.FIELD, ElementType.METHOD, ElementType.TYPE}) @Retention(Retention
例如我有如下界面 public interface Converter { public O convert(I input); } 实现该接口(interface)的抽象类 public a
我有两个方面,每个方面都修改方法参数。当两个方面都应用于同一方法时,我希望这些方面的执行被链接起来,并且我希望在第一个方面修改的参数可以通过 joinPoint.getArgs(); 但是,似乎每个方
对不起,这不是一个具体的问题。因为我是 Jsprit 的新手,所以我需要一些关于如何开始解决问题的概念性帮助。 我的例子: 我开始时只有一辆车带有开始和结束位置。有多个优先取货位置,只有一个仓库位置用
尝试设计简单的方面,当执行任何公共(public)方法时,将打印单词“logg”到控制台。 方面: @Aspect public class LoggingAspect { @Pointcut
我知道Spring必须实现一个专门用于事务的“建议”,那么实现tx:advice的代码在哪里?标签? 我也会感谢 标签的实现,如果你能指出在 spring jar 中的位置。 最佳答案 Spring
我想看看是否已经有类似的问题,但找不到,所以就在这里。 我们有一个遗留代码,其中单个 BO 使用反射对许多 DAO 进行方法调用。为了简单起见,我修改了代码。 @Transactional class
我在部署新方面时遇到此异常: @Aspect public class MyAspect { @Before("@annotation(PreAuthorizeAccess)") pu
我想从单个表中获取信息,其中我将显示每条记录的最新交易,同时显示上一个交易的记录。 表: |id | account_no | date1 | price | |1 | 101
我们正在寻找具有以下功能的 CMS。 LDAP 认证 浏览器内的所见即所得编辑器 可以声明架构,如教师、学生、类(class)、房间、 session 、 session 记录、项目、论文、报告等,以
我的 Spring AOP 程序未按预期运行。我在下面创建了简单的AOP注释程序,但输出不是我想象的。 节目: Beans.xml 学生.java 包
在我的例子中,我使用了以下建议: @Around(value = "@annotation(MyAnnotation) && args(MyArgs)") 一旦将 MyAnnotation 添加
我在一个小项目上运行 HLint,它建议我使用 &&&。 例子 : >>> cat st.hs f = (+) 10 g = (+) 1 main = print $ (\x -> (f x, g x
Closed. This question needs to be more focused。它当前不接受答案。 想要改善这个问题吗?更新问题,使它仅关注editing this post的一个问题。
我正在使用 RethinkDB 构建一个应用程序,我即将切换到使用 changefeeds。但我面临着一个架构选择,我想得到一些建议。 我的应用程序当前在用户登录时从几个表中加载所有用户数据(将所有数
我有两个支持grpc通讯的后端。 我为每个人创建了一个具有这个build.gradle的简单android项目 apply plugin: 'com.android.library' apply pl
我使用以下组件依赖关系树制作了一个简单的应用程序: Service1 injects Service2(via constructor) Service2 injects SomeContext(vi
我正在尝试使用moSKito监控工具遵循此step-by-step guide 。我已将这些字符串添加到 pom.xml 文件中: net.anotheria moskito-core
假设我们有以下数据框: import pandas as pd df = pd.read_csv('subjects.csv') Col A, Interest, Col S
我正在测试 Spring AOP 框架并有以下问题。 我有以下代码: package danny.test.controllers; @Controller public class MyContro
我是一名优秀的程序员,十分优秀!