本文介紹了Spring AOP錯誤無法懶惰地為此建議構建thisJoinPoint的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!
問題描述
切入點聲明:
@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(1.5版)編譯方面時,出現錯誤"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()");
}
}
第2部分:
此外,該錯誤還表明您沒有保護您的建議。從技術上講,Guard使您的代碼更快,因為您不需要在每次執行它時都構造thisJoinPoint。因此,如果沒有意義,您可以嘗試忽略它
canNotImplementLazyTjp = ignore
multipleAdviceStoppingLazyTjp=ignore
noGuardForLazyTjp=ignore
這篇關于Spring AOP錯誤無法懶惰地為此建議構建thisJoinPoint的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,