Spring AOP错误无法懒惰地为此建议构建thisJoinPoint
原学程将引见Spring AOP毛病没法懒散天为此修议建立thisJoinPoint的处置办法,这篇学程是从其余处所瞅到的,而后减了1些海外法式员的疑问与解问,愿望能对于您有所赞助,佳了,上面开端进修吧。
成绩描写
切进面申明:
@Pointcut(value="com.someapp.someservice.someOperation() && args(t,req)",argNames="t,req")
private void logOperationArg(final String t,final String req)
{
}
修议申明未编译:
@Before(value="logOperationArg(t,req)")
public void logBeforeOperationAdvice(JoinPoint jp, final String t, final String req){
...
}
应用AspectJ-maven-plugin(一.五版)编译圆里时,涌现毛病"can not build thisJoinPoint lazily for this advice since it has no suitable guard [Xlint:noGuardForLazyTjp]"
但是编译雷同的修议时没有应用JoinPoint参数。
修议申明汇编:
@Before(value="logOperationArg(t,req)")
public void logBeforeOperationAdvice(final String t, final String req){
...
}
推举谜底
Spring AOP
仅支撑method join points
,由于它鉴于dynamic proxies
在须要时创立署理对于象(比方,假如您应用的是ApplicationContext,则它将在从BeanFactory
减载Bean后创立)
应用execution()
语句婚配作为办法履行的衔接面。
比方:
class LogAspect {
@Before("execution(* com.test.work.Working(..))")
public void beginBefore(JoinPoint join){
System.out.println("This will be displayed before Working() method will be executed");
}
如今怎样申明您的BO:
//.. declare interface
而后:
class BoModel implements SomeBoInterface {
public void Working(){
System.out.println("It will works after aspect");
}
}
execution()
语句是PointCut表白式,用于告诉应将修议运用于那边。
假如您爱好应用@PointCut
,不妨如许做:
class LogAspect {
//define a pointcut
@PointCut(
"execution(* com.test.work.SomeInferface.someInterfaceMethod(..))")
public void PointCutLoc() {
}
@Before("PointCutLoc()")
public void getBefore(){
System.out.println("This will be executed before someInterfaceMethod()");
}
}
第二部门:
别的,该毛病借注解您出有掩护您的修议。从技巧上道,Guard使您的代码更快,由于您没有须要在每一次履行它时皆结构thisJoinPoint。是以,假如出成心义,您不妨测验考试疏忽它
canNotImplementLazyTjp = ignore
multipleAdviceStoppingLazyTjp=ignore
noGuardForLazyTjp=ignore
佳了闭于Spring AOP毛病没法懒散天为此修议建立thisJoinPoint的学程便到这里便停止了,愿望趣模板源码网找到的这篇技巧文章能赞助到年夜野,更多技巧学程不妨在站内搜刮。