public abstract class AbstractAspectJAdvice extends java.lang.Object implements AspectJPrecedenceInformation
org.aopalliance.aop.Advice
classes
wrapping an AspectJ aspect or an AspectJ-annotated advice method.Modifier and Type | Class and Description |
---|---|
private static class |
AbstractAspectJAdvice.AdviceExcludingMethodMatcher
MethodMatcher that excludes the specified advice method.
|
Modifier and Type | Field and Description |
---|---|
private int |
adviceInvocationArgumentCount
The total number of arguments we have to populate on advice dispatch
|
private java.util.Map<java.lang.String,java.lang.Integer> |
argumentBindings |
private java.lang.String[] |
argumentNames
This will be non-null if the creator of this advice object knows the argument names
and sets them explicitly
|
private boolean |
argumentsIntrospected |
private AspectInstanceFactory |
aspectInstanceFactory |
protected java.lang.reflect.Method |
aspectJAdviceMethod |
private java.lang.String |
aspectName
The name of the aspect (ref bean) in which this advice was defined (used
when determining advice precedence so that we can determine
whether two pieces of advice come from the same aspect).
|
private int |
declarationOrder
The order of declaration of this advice within the aspect.
|
private java.lang.reflect.Type |
discoveredReturningGenericType |
private java.lang.Class<?> |
discoveredReturningType |
private java.lang.Class<?> |
discoveredThrowingType |
protected static java.lang.String |
JOIN_POINT_KEY
Key used in ReflectiveMethodInvocation userAtributes map for the current joinpoint.
|
private int |
joinPointArgumentIndex
Index for thisJoinPoint argument (currently only
supported at index 0 if present at all)
|
private int |
joinPointStaticPartArgumentIndex
Index for thisJoinPointStaticPart argument (currently only
supported at index 0 if present at all)
|
private AspectJExpressionPointcut |
pointcut |
private java.lang.String |
returningName
Non-null if after returning advice binds the return value
|
private java.lang.String |
throwingName
Non-null if after throwing advice binds the thrown value
|
HIGHEST_PRECEDENCE, LOWEST_PRECEDENCE
Constructor and Description |
---|
AbstractAspectJAdvice(java.lang.reflect.Method aspectJAdviceMethod,
AspectJExpressionPointcut pointcut,
AspectInstanceFactory aspectInstanceFactory)
Create a new AbstractAspectJAdvice for the given advice method.
|
Modifier and Type | Method and Description |
---|---|
protected java.lang.Object[] |
argBinding(JoinPoint jp,
JoinPointMatch jpMatch,
java.lang.Object returnValue,
java.lang.Throwable ex)
Take the arguments at the method execution join point and output a set of arguments
to the advice method
|
private void |
bindArgumentsByName(int numArgumentsExpectingToBind) |
private void |
bindExplicitArguments(int numArgumentsLeftToBind) |
Pointcut |
buildSafePointcut()
Build a 'safe' pointcut that excludes the AspectJ advice method itself.
|
void |
calculateArgumentBindings()
Do as much work as we can as part of the set-up so that argument binding
on subsequent advice invocations can be as fast as possible.
|
private void |
configurePointcutParameters(int argumentIndexOffset)
All parameters from argumentIndexOffset onwards are candidates for
pointcut parameters - but returning and throwing vars are handled differently
and must be removed from the list if present.
|
protected ParameterNameDiscoverer |
createParameterNameDiscoverer()
Create a ParameterNameDiscoverer to be used for argument binding.
|
static JoinPoint |
currentJoinPoint()
Lazily instantiate joinpoint for the current invocation.
|
java.lang.ClassLoader |
getAspectClassLoader()
Return the ClassLoader for aspect instances.
|
AspectInstanceFactory |
getAspectInstanceFactory()
Return the factory for aspect instances.
|
java.lang.reflect.Method |
getAspectJAdviceMethod()
Return the AspectJ-style advice method.
|
java.lang.String |
getAspectName()
The name of the aspect (bean) in which the advice was declared.
|
int |
getDeclarationOrder()
The declaration order of the advice member within the aspect.
|
protected java.lang.reflect.Type |
getDiscoveredReturningGenericType() |
protected java.lang.Class<?> |
getDiscoveredReturningType() |
protected java.lang.Class<?> |
getDiscoveredThrowingType() |
protected JoinPoint |
getJoinPoint()
Overridden in around advice to return proceeding join point.
|
protected JoinPointMatch |
getJoinPointMatch()
Get the current join point match at the join point we are being dispatched on.
|
protected JoinPointMatch |
getJoinPointMatch(ProxyMethodInvocation pmi) |
int |
getOrder()
Return the order value of this object, with a
higher value meaning greater in terms of sorting.
|
AspectJExpressionPointcut |
getPointcut()
Return the AspectJ expression pointcut.
|
protected java.lang.Object |
invokeAdviceMethod(JoinPoint jp,
JoinPointMatch jpMatch,
java.lang.Object returnValue,
java.lang.Throwable t) |
protected java.lang.Object |
invokeAdviceMethod(JoinPointMatch jpMatch,
java.lang.Object returnValue,
java.lang.Throwable ex)
Invoke the advice method.
|
protected java.lang.Object |
invokeAdviceMethodWithGivenArgs(java.lang.Object[] args) |
private boolean |
isVariableName(java.lang.String name) |
private boolean |
maybeBindJoinPoint(java.lang.Class<?> candidateParameterType) |
private boolean |
maybeBindJoinPointStaticPart(java.lang.Class<?> candidateParameterType) |
private boolean |
maybeBindProceedingJoinPoint(java.lang.Class<?> candidateParameterType) |
void |
setArgumentNames(java.lang.String argNames)
Set by creator of this advice object if the argument names are known.
|
void |
setArgumentNamesFromStringArray(java.lang.String... args) |
void |
setAspectName(java.lang.String name) |
void |
setDeclarationOrder(int order)
Sets the declaration order of this advice within the aspect
|
void |
setReturningName(java.lang.String name) |
protected void |
setReturningNameNoCheck(java.lang.String name)
We need to hold the returning name at this level for argument binding calculations,
this method allows the afterReturning advice subclass to set the name.
|
void |
setThrowingName(java.lang.String name) |
protected void |
setThrowingNameNoCheck(java.lang.String name)
We need to hold the throwing name at this level for argument binding calculations,
this method allows the afterThrowing advice subclass to set the name.
|
protected boolean |
supportsProceedingJoinPoint() |
java.lang.String |
toString() |
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
isAfterAdvice, isBeforeAdvice
protected static final java.lang.String JOIN_POINT_KEY
protected final java.lang.reflect.Method aspectJAdviceMethod
private final int adviceInvocationArgumentCount
private final AspectJExpressionPointcut pointcut
private final AspectInstanceFactory aspectInstanceFactory
private java.lang.String aspectName
private int declarationOrder
private java.lang.String[] argumentNames
private java.lang.String throwingName
private java.lang.String returningName
private java.lang.Class<?> discoveredReturningType
private java.lang.Class<?> discoveredThrowingType
private int joinPointArgumentIndex
private int joinPointStaticPartArgumentIndex
private java.util.Map<java.lang.String,java.lang.Integer> argumentBindings
private boolean argumentsIntrospected
private java.lang.reflect.Type discoveredReturningGenericType
public AbstractAspectJAdvice(java.lang.reflect.Method aspectJAdviceMethod, AspectJExpressionPointcut pointcut, AspectInstanceFactory aspectInstanceFactory)
aspectJAdviceMethod
- the AspectJ-style advice methodpointcut
- the AspectJ expression pointcutaspectInstanceFactory
- the factory for aspect instancespublic static JoinPoint currentJoinPoint()
Do not use if access is available to the current ReflectiveMethodInvocation (in an around advice).
public final java.lang.reflect.Method getAspectJAdviceMethod()
public final AspectJExpressionPointcut getPointcut()
public final Pointcut buildSafePointcut()
getPointcut()
public final AspectInstanceFactory getAspectInstanceFactory()
public final java.lang.ClassLoader getAspectClassLoader()
public int getOrder()
Ordered
Normally starting with 0, with Integer.MAX_VALUE
indicating the greatest value. Same order values will result
in arbitrary positions for the affected objects.
Higher values can be interpreted as lower priority. As a consequence, the object with the lowest value has highest priority (somewhat analogous to Servlet "load-on-startup" values).
public void setAspectName(java.lang.String name)
public java.lang.String getAspectName()
AspectJPrecedenceInformation
getAspectName
in interface AspectJPrecedenceInformation
public void setDeclarationOrder(int order)
public int getDeclarationOrder()
AspectJPrecedenceInformation
getDeclarationOrder
in interface AspectJPrecedenceInformation
public void setArgumentNames(java.lang.String argNames)
This could be for example because they have been explicitly specified in XML, or in an advice annotation.
argNames
- comma delimited list of arg namespublic void setArgumentNamesFromStringArray(java.lang.String... args)
public void setReturningName(java.lang.String name)
protected void setReturningNameNoCheck(java.lang.String name)
protected java.lang.Class<?> getDiscoveredReturningType()
protected java.lang.reflect.Type getDiscoveredReturningGenericType()
public void setThrowingName(java.lang.String name)
protected void setThrowingNameNoCheck(java.lang.String name)
protected java.lang.Class<?> getDiscoveredThrowingType()
private boolean isVariableName(java.lang.String name)
public final void calculateArgumentBindings()
If the first argument is of type JoinPoint or ProceedingJoinPoint then we pass a JoinPoint in that position (ProceedingJoinPoint for around advice).
If the first argument is of type JoinPoint.StaticPart
then we pass a JoinPoint.StaticPart
in that position.
Remaining arguments have to be bound by pointcut evaluation at a given join point. We will get back a map from argument name to value. We need to calculate which advice parameter needs to be bound to which argument name. There are multiple strategies for determining this binding, which are arranged in a ChainOfResponsibility.
private boolean maybeBindJoinPoint(java.lang.Class<?> candidateParameterType)
private boolean maybeBindProceedingJoinPoint(java.lang.Class<?> candidateParameterType)
protected boolean supportsProceedingJoinPoint()
private boolean maybeBindJoinPointStaticPart(java.lang.Class<?> candidateParameterType)
private void bindArgumentsByName(int numArgumentsExpectingToBind)
protected ParameterNameDiscoverer createParameterNameDiscoverer()
The default implementation creates a DefaultParameterNameDiscoverer
and adds a specifically configured AspectJAdviceParameterNameDiscoverer
.
private void bindExplicitArguments(int numArgumentsLeftToBind)
private void configurePointcutParameters(int argumentIndexOffset)
protected java.lang.Object[] argBinding(JoinPoint jp, JoinPointMatch jpMatch, java.lang.Object returnValue, java.lang.Throwable ex)
jp
- the current JoinPointjpMatch
- the join point match that matched this execution join pointreturnValue
- the return value from the method execution (may be null)ex
- the exception thrown by the method execution (may be null)protected java.lang.Object invokeAdviceMethod(JoinPointMatch jpMatch, java.lang.Object returnValue, java.lang.Throwable ex) throws java.lang.Throwable
jpMatch
- the JoinPointMatch that matched this execution join pointreturnValue
- the return value from the method execution (may be null)ex
- the exception thrown by the method execution (may be null)java.lang.Throwable
- in case of invocation failureprotected java.lang.Object invokeAdviceMethod(JoinPoint jp, JoinPointMatch jpMatch, java.lang.Object returnValue, java.lang.Throwable t) throws java.lang.Throwable
java.lang.Throwable
protected java.lang.Object invokeAdviceMethodWithGivenArgs(java.lang.Object[] args) throws java.lang.Throwable
java.lang.Throwable
protected JoinPoint getJoinPoint()
protected JoinPointMatch getJoinPointMatch()
protected JoinPointMatch getJoinPointMatch(ProxyMethodInvocation pmi)
public java.lang.String toString()
toString
in class java.lang.Object