我有以下方面
@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错误
它是一个简单的弹簧应用程序。它可能是不起作用的原因?
答案 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();
// ...
}