Spring AOP介绍不适用于&&这个(IntroducedInterface)

时间:2017-08-28 13:45:32

标签: spring spring-aop

我有以下方面

@Aspect
public class AspectClass{
   @DeclareParents(value="com.mac.model.*",defaultImpl=Impl.class)
   public IntroduceInterface inter;

   @Pointcut("execution(* com.mac.Employee.display(..))")
   public void empPointcut(){}

  @Before("empPointCut() && this(introduceInterface)")
  public void BeforeAdvice(JoinPoint jp,IntroduceInterface inf){
  inf.introMethod();
  }
}

我试图从spring docs复制代码,如下所示:

@Aspect
public class UsageTracking {

    @DeclareParents(value="com.xzy.myapp.service.*+", defaultImpl=DefaultUsageTracked.class)
    public static UsageTracked mixin;

    @Before("com.xyz.myapp.SystemArchitecture.businessService() && this(usageTracked)")
    public void recordUsage(UsageTracked usageTracked) {
        usageTracked.incrementUseCount();
    }

}

但它没有发挥给出错误: 切入点处于:: 0正式未绑定的IllegalArgumentException错误

它是一个简单的弹簧应用程序。它可能是不起作用的原因?

2 个答案:

答案 0 :(得分:0)

这里的名字

@Before("empPointCut() && this(_name_in_here_)")

应与

中的相同
public void BeforeAdvice(JoinPoint jp,IntroduceInterface _name_in_here_){

所以这应该可以正常工作:

@Aspect
public class AspectClass{
   @DeclareParents(value="com.mac.model.*",defaultImpl=Impl.class)
   public IntroduceInterface inter;

   @Pointcut("execution(* com.mac.Employee.display(..))")
   public void empPointcut(){}

  @Before("empPointCut() && this(inf)")
  public void BeforeAdvice(JoinPoint jp,IntroduceInterface inf){
  inf.introMethod();
  }
}

答案 1 :(得分:0)

通过注释参数,建议可以使用注释对象。因此,两个名称(在切入点表达式中声明的方法参数名称和注释)应该相同。

请查看spring文档中的这两部分 - Passing parameters to advice

来自Spring doc:

代理对象(this),目标对象(目标)和注释(@ within,@ target,@ annotation,@ args)都可以以类似的方式绑定。以下示例显示了如何匹配使用@Auditable注释注释的方法的执行,并提取审计代码。

首先是@Auditable注释的定义:

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Auditable {
    AuditCode value();
}

然后是与@Auditable方法的执行相匹配的建议:

@Before("com.xyz.lib.Pointcuts.anyPublicMethod() && @annotation(**auditable**)")
public void audit(Auditable **auditable**) {
    AuditCode code = auditable.value();
    // ...
}