@ -1,5 +1,5 @@
@@ -1,5 +1,5 @@
/ *
* Copyright 2002 - 2015 the original author or authors .
* Copyright 2002 - 2018 the original author or authors .
*
* Licensed under the Apache License , Version 2 . 0 ( the "License" ) ;
* you may not use this file except in compliance with the License .
@ -109,29 +109,22 @@ class InstantiationModelAwarePointcutAdvisorImpl
@@ -109,29 +109,22 @@ class InstantiationModelAwarePointcutAdvisorImpl
/ * *
* The pointcut for Spring AOP to use . Actual behaviour of the pointcut will change
* depending on the state of the advice .
* The pointcut for Spring AOP to use .
* Actual behaviour of the pointcut will change depending on the state of the advice .
* /
@Override
public Pointcut getPointcut ( ) {
return this . pointcut ;
}
/ * *
* This is only of interest for Spring AOP : AspectJ instantiation semantics
* are much richer . In AspectJ terminology , all a return of { @code true }
* means here is that the aspect is not a SINGLETON .
* /
@Override
public boolean isPerInstance ( ) {
return ( getAspectMetadata ( ) . getAjType ( ) . getPerClause ( ) . getKind ( ) ! = PerClauseKind . SINGLETON ) ;
public boolean isLazy ( ) {
return this . lazy ;
}
/ * *
* Return the AspectJ AspectMetadata for this advisor .
* /
public AspectMetadata getAspectMetadata ( ) {
return this . aspectInstanceFactory . getAspectMetadata ( ) ;
@Override
public synchronized boolean isAdviceInstantiated ( ) {
return ( this . instantiatedAdvice ! = null ) ;
}
/ * *
@ -145,20 +138,26 @@ class InstantiationModelAwarePointcutAdvisorImpl
@@ -145,20 +138,26 @@ class InstantiationModelAwarePointcutAdvisorImpl
return this . instantiatedAdvice ;
}
@Override
public boolean isLazy ( ) {
return this . lazy ;
private Advice instantiateAdvice ( AspectJExpressionPointcut pcut ) {
return this . aspectJAdvisorFactory . getAdvice ( this . aspectJAdviceMethod , pcut ,
this . aspectInstanceFactory , this . declarationOrder , this . aspectName ) ;
}
/ * *
* This is only of interest for Spring AOP : AspectJ instantiation semantics
* are much richer . In AspectJ terminology , all a return of { @code true }
* means here is that the aspect is not a SINGLETON .
* /
@Override
public synchronized boolean isAdviceInstantiated ( ) {
return ( this . instantiatedAdvice ! = null ) ;
public boolean isPerInstance ( ) {
return ( getAspectMetadata ( ) . getAjType ( ) . getPerClause ( ) . getKind ( ) ! = PerClauseKind . SINGLETON ) ;
}
private Advice instantiateAdvice ( AspectJExpressionPointcut pcut ) {
return this . aspectJAdvisorFactory . getAdvice ( this . aspectJAdviceMethod , pcut ,
this . aspectInstanceFactory , this . declarationOrder , this . aspectName ) ;
/ * *
* Return the AspectJ AspectMetadata for this advisor .
* /
public AspectMetadata getAspectMetadata ( ) {
return this . aspectInstanceFactory . getAspectMetadata ( ) ;
}
public MetadataAwareAspectInstanceFactory getAspectInstanceFactory ( ) {
@ -213,33 +212,26 @@ class InstantiationModelAwarePointcutAdvisorImpl
@@ -213,33 +212,26 @@ class InstantiationModelAwarePointcutAdvisorImpl
}
else {
switch ( aspectJAnnotation . getAnnotationType ( ) ) {
case AtAfter :
case AtAfterReturning :
case AtAfterThrowing :
this . isAfterAdvice = true ;
this . isBeforeAdvice = false ;
break ;
case AtAround :
case AtPointcut :
this . isAfterAdvice = false ;
case AtAround :
this . isBeforeAdvice = false ;
this . isAfterAdvice = false ;
break ;
case AtBefore :
this . isAfterAdvice = false ;
this . isBeforeAdvice = true ;
this . isAfterAdvice = false ;
break ;
case AtAfter :
case AtAfterReturning :
case AtAfterThrowing :
this . isBeforeAdvice = false ;
this . isAfterAdvice = true ;
break ;
}
}
}
@Override
public String toString ( ) {
return "InstantiationModelAwarePointcutAdvisor: expression [" + getDeclaredPointcut ( ) . getExpression ( ) +
"]; advice method [" + this . aspectJAdviceMethod + "]; perClauseKind=" +
this . aspectInstanceFactory . getAspectMetadata ( ) . getAjType ( ) . getPerClause ( ) . getKind ( ) ;
}
private void readObject ( ObjectInputStream inputStream ) throws IOException , ClassNotFoundException {
inputStream . defaultReadObject ( ) ;
try {
@ -250,11 +242,18 @@ class InstantiationModelAwarePointcutAdvisorImpl
@@ -250,11 +242,18 @@ class InstantiationModelAwarePointcutAdvisorImpl
}
}
@Override
public String toString ( ) {
return "InstantiationModelAwarePointcutAdvisor: expression [" + getDeclaredPointcut ( ) . getExpression ( ) +
"]; advice method [" + this . aspectJAdviceMethod + "]; perClauseKind=" +
this . aspectInstanceFactory . getAspectMetadata ( ) . getAjType ( ) . getPerClause ( ) . getKind ( ) ;
}
/ * *
* Pointcut implementation that changes its behaviour when the advice is instantiated .
* Note that this is a < i > dynamic < / i > pointcut . Otherwise it might
* be optimized out if it does not at first match statically .
* Note that this is a < i > dynamic < / i > pointcut ; o therwise it might be optimized ou t
* if it does not at first match statically .
* /
private class PerTargetInstantiationModelPointcut extends DynamicMethodMatcherPointcut {
@ -264,8 +263,9 @@ class InstantiationModelAwarePointcutAdvisorImpl
@@ -264,8 +263,9 @@ class InstantiationModelAwarePointcutAdvisorImpl
private LazySingletonAspectInstanceFactoryDecorator aspectInstanceFactory ;
private PerTargetInstantiationModelPointcut ( AspectJExpressionPointcut declaredPointcut ,
public PerTargetInstantiationModelPointcut ( AspectJExpressionPointcut declaredPointcut ,
Pointcut preInstantiationPointcut , MetadataAwareAspectInstanceFactory aspectInstanceFactory ) {
this . declaredPointcut = declaredPointcut ;
this . preInstantiationPointcut = preInstantiationPointcut ;
if ( aspectInstanceFactory instanceof LazySingletonAspectInstanceFactoryDecorator ) {
@ -275,7 +275,8 @@ class InstantiationModelAwarePointcutAdvisorImpl
@@ -275,7 +275,8 @@ class InstantiationModelAwarePointcutAdvisorImpl
@Override
public boolean matches ( Method method , Class < ? > targetClass ) {
// We're either instantiated and matching on declared pointcut, or uninstantiated matching on either pointcut
// We're either instantiated and matching on declared pointcut,
// or uninstantiated matching on either pointcut...
return ( isAspectMaterialized ( ) & & this . declaredPointcut . matches ( method , targetClass ) ) | |
this . preInstantiationPointcut . getMethodMatcher ( ) . matches ( method , targetClass ) ;
}