特定注释变量的AOP切入点表达式

时间:2015-06-09 16:20:54

标签: java spring aop

我有这样的场景..

自定义注释定义...

@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface CacheMe{
   String node();
}

用户详细信息类...

class User {
  String name;
  String ssn; 
}

和#34; User"对象作为变量并使用@CacheMe注释

Class Test{

   @CacheMe(node="user")
   User user;

   public User getUser(Long id){
       if(user != null){
       user = someImplementingClass.getUserDetails(id);
      }
      ....
      .....   
   }

}

当" user"时,我需要切入点表达式验证对象为null或访问用户对象时。 我使用基于Spring模式的AOP。

感谢您的时间。

1 个答案:

答案 0 :(得分:1)

正如之前的评论中所指出的,Spring AOP不支持字段级别的建议。这是因为Spring AOP使用代理(在类或接口级别,具体取决于具体方案)。代理包装实例并能够检测方法调用。 如果你考虑一下,包装器不能检测属性修改,因为根本不能覆盖属性,它只能被遮蔽(从java的角度来看)。

使用Spring AOP,您将能够为getter& amp; setters,但如果您需要Field建议,那么您唯一的选择是AspectJ。 (如果您需要建议构造函数和异常引发,则同样适用。)

检查快速aspectJ参考here并记住,如果你走这条路,你可能需要使用这些切入点:

  • 获取(签名):对与Signature
  • 匹配的任何字段的每次引用
  • 设置(签名):对与签名匹配的任何字段的每个分配。可以使用args切入点
  • 公开指定的值

此外,如果您决定使用aspectJ,则需要设置some things in your app,并决定是否更喜欢加载时编织或编译时编织。该决定会带来您可能想要keep in mind的重要后果。