【问题标题】:Is there a way to write a pointcut for a getter to an annotated field?有没有办法为带注释字段的吸气剂编写切入点?
【发布时间】:2014-07-08 01:37:20
【问题描述】:

我正在尝试编写一个切入点,它将拦截带注释成员的 getter。

public class MyClass {

    private String volume;

    @MyAttribute
    private Validity validity;


    public void setValidity( Validity obj ){
        validity = obj;
    }

    public Validity getValidity(){
        return validity;
    }
}

有没有办法编写一个切入点,该切入点将拦截所有基于validity@MyAttribute 注释的getValidity() 调用?换种说法,我希望为使用 @MyAttribute 注释的成员字段的任何 getter 创建一个切入点。

一个简单的 getter 切入点可以建议任何 getter 方法:

pointcut embeddedGetter() : execution( public * com.ia.domain..get*());

但这不会指定它正在获取的字段必须被注释。如果我在public 前面加上一个修饰符,它将指定必须对getter 方法进行注释,但事实并非如此。

这是否可行?

【问题讨论】:

  • 应该有一个@annotation 切入点指示符,您可以使用通配符表达式作为方法的名称(及其返回类型)。
  • @SotiriosDelimanolis 但是如果我在 getter 上创建我的切入点,我如何将它与字段上的注释联系起来?任何注释匹配都将基于 getter 的注释 - 而不是字段。
  • 哦,我错过了那部分。我以为吸气剂被注释了。我认为您不能将方法与字段相关联。

标签: java aop aspectj


【解决方案1】:

在玩了 AspectJ 之后,我终于重新发现了我一直在寻找的连接点:

pointcut embeddedGetter() : get( @MyAnnotation Validity *..* );

关键是不要使用execution 切入点,而是使用get

【讨论】:

  • 你碰巧知道这个切入点的 Spring AOP 等价物吗?我一直试图找到它有一段时间了,但没有运气。
  • @PranjalGore 我已经有一段时间没有使用spring aop了,但我记得最后一次它无法创建这些切入点。它仅限于公共可执行方法。因此,它会直接创建指向 getter 的切入点,而不是通过字段创建切入点。
猜你喜欢
  • 2020-09-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-17
  • 1970-01-01
  • 2020-05-11
  • 2021-02-27
相关资源
最近更新 更多