hzzz 7 years ago
parent
commit
254487feb5
  1. 2
      fine-spring/src/com/fr/third/springframework/aop/aspectj/AspectMetadata.java
  2. 89
      fine-spring/src/com/fr/third/springframework/aop/aspectj/InstantiationModelAwarePointcutAdvisorImpl.java

2
fine-spring/src/com/fr/third/springframework/aop/aspectj/AspectMetadata.java

@ -16,6 +16,7 @@
package com.fr.third.springframework.aop.aspectj; package com.fr.third.springframework.aop.aspectj;
import com.fr.third.aspectj.lang.annotation.Aspect;
import com.fr.third.aspectj.lang.reflect.AjType; import com.fr.third.aspectj.lang.reflect.AjType;
import com.fr.third.aspectj.lang.reflect.AjTypeSystem; import com.fr.third.aspectj.lang.reflect.AjTypeSystem;
import com.fr.third.aspectj.lang.reflect.PerClauseKind; import com.fr.third.aspectj.lang.reflect.PerClauseKind;
@ -23,7 +24,6 @@ import com.fr.third.aspectj.lang.reflect.PerClauseKind;
import com.fr.third.springframework.aop.Pointcut; import com.fr.third.springframework.aop.Pointcut;
import com.fr.third.springframework.aop.framework.AopConfigException; import com.fr.third.springframework.aop.framework.AopConfigException;
import com.fr.third.springframework.aop.support.ComposablePointcut; import com.fr.third.springframework.aop.support.ComposablePointcut;
import org.aspectj.lang.annotation.Aspect;
/** /**
* Metadata for an AspectJ aspect class, with an additional Spring AOP pointcut * Metadata for an AspectJ aspect class, with an additional Spring AOP pointcut

89
fine-spring/src/com/fr/third/springframework/aop/aspectj/InstantiationModelAwarePointcutAdvisorImpl.java

@ -16,17 +16,18 @@
package com.fr.third.springframework.aop.aspectj; package com.fr.third.springframework.aop.aspectj;
import java.lang.reflect.Method;
import org.aopalliance.aop.Advice;
import com.fr.third.aspectj.lang.reflect.PerClauseKind; import com.fr.third.aspectj.lang.reflect.PerClauseKind;
import com.fr.third.springframework.aop.Pointcut; import com.fr.third.springframework.aop.Pointcut;
import com.fr.third.springframework.aop.support.DynamicMethodMatcherPointcut; import com.fr.third.springframework.aop.support.DynamicMethodMatcherPointcut;
import com.fr.third.springframework.aop.support.Pointcuts; import com.fr.third.springframework.aop.support.Pointcuts;
import org.aopalliance.aop.Advice;
import java.lang.reflect.Method;
/** /**
* Internal implementation of AspectJPointcutAdvisor. Note that there will be one instance of this * Internal implementation of AspectJPointcutAdvisor.
* advisor for each target method. * Note that there will be one instance of this advisor for each target method.
* *
* @author Rod Johnson * @author Rod Johnson
* @author Juergen Hoeller * @author Juergen Hoeller
@ -57,13 +58,9 @@ class InstantiationModelAwarePointcutAdvisorImpl
private Boolean isAfterAdvice; private Boolean isAfterAdvice;
public InstantiationModelAwarePointcutAdvisorImpl(
AspectJAdvisorFactory af, public InstantiationModelAwarePointcutAdvisorImpl(AspectJAdvisorFactory af, AspectJExpressionPointcut ajexp,
AspectJExpressionPointcut ajexp, MetadataAwareAspectInstanceFactory aif, Method method, int declarationOrderInAspect, String aspectName) {
MetadataAwareAspectInstanceFactory aif,
Method method,
int declarationOrderInAspect,
String aspectName) {
this.declaredPointcut = ajexp; this.declaredPointcut = ajexp;
this.method = method; this.method = method;
@ -80,11 +77,10 @@ class InstantiationModelAwarePointcutAdvisorImpl
// Make it dynamic: must mutate from pre-instantiation to post-instantiation state. // Make it dynamic: must mutate from pre-instantiation to post-instantiation state.
// If it's not a dynamic pointcut, it may be optimized out // If it's not a dynamic pointcut, it may be optimized out
// by the Spring AOP infrastructure after the first evaluation. // by the Spring AOP infrastructure after the first evaluation.
this.pointcut = this.pointcut = new PerTargetInstantiationModelPointcut(this.declaredPointcut, preInstantiationPointcut, aif);
new PerTargetInstantiationModelPointcut(
this.declaredPointcut, preInstantiationPointcut, aif);
this.lazy = true; this.lazy = true;
} else { }
else {
// A singleton aspect. // A singleton aspect.
this.instantiatedAdvice = instantiateAdvice(this.declaredPointcut); this.instantiatedAdvice = instantiateAdvice(this.declaredPointcut);
this.pointcut = declaredPointcut; this.pointcut = declaredPointcut;
@ -92,9 +88,10 @@ class InstantiationModelAwarePointcutAdvisorImpl
} }
} }
/** /**
* The pointcut for Spring AOP to use. Actual behaviour of the pointcut will change depending on * The pointcut for Spring AOP to use. Actual behaviour of the pointcut will change
* the state of the advice. * depending on the state of the advice.
*/ */
@Override @Override
public Pointcut getPointcut() { public Pointcut getPointcut() {
@ -102,21 +99,25 @@ class InstantiationModelAwarePointcutAdvisorImpl
} }
/** /**
* This is only of interest for Spring AOP: AspectJ instantiation semantics are much richer. In * This is only of interest for Spring AOP: AspectJ instantiation semantics
* AspectJ terminology, all a return of {@code true} means here is that the aspect is not a * are much richer. In AspectJ terminology, all a return of {@code true}
* SINGLETON. * means here is that the aspect is not a SINGLETON.
*/ */
@Override @Override
public boolean isPerInstance() { public boolean isPerInstance() {
return (getAspectMetadata().getAjType().getPerClause().getKind() != PerClauseKind.SINGLETON); return (getAspectMetadata().getAjType().getPerClause().getKind() != PerClauseKind.SINGLETON);
} }
/** Return the AspectJ AspectMetadata for this advisor. */ /**
* Return the AspectJ AspectMetadata for this advisor.
*/
public AspectMetadata getAspectMetadata() { public AspectMetadata getAspectMetadata() {
return this.aspectInstanceFactory.getAspectMetadata(); return this.aspectInstanceFactory.getAspectMetadata();
} }
/** Lazily instantiate advice if necessary. */ /**
* Lazily instantiate advice if necessary.
*/
@Override @Override
public synchronized Advice getAdvice() { public synchronized Advice getAdvice() {
if (this.instantiatedAdvice == null) { if (this.instantiatedAdvice == null) {
@ -135,6 +136,7 @@ class InstantiationModelAwarePointcutAdvisorImpl
return (this.instantiatedAdvice != null); return (this.instantiatedAdvice != null);
} }
private Advice instantiateAdvice(AspectJExpressionPointcut pcut) { private Advice instantiateAdvice(AspectJExpressionPointcut pcut) {
return this.atAspectJAdvisorFactory.getAdvice( return this.atAspectJAdvisorFactory.getAdvice(
this.method, pcut, this.aspectInstanceFactory, this.declarationOrder, this.aspectName); this.method, pcut, this.aspectInstanceFactory, this.declarationOrder, this.aspectName);
@ -180,7 +182,8 @@ class InstantiationModelAwarePointcutAdvisorImpl
} }
/** /**
* Duplicates some logic from getAdvice, but importantly does not force creation of the advice. * Duplicates some logic from getAdvice, but importantly does not force
* creation of the advice.
*/ */
private void determineAdviceType() { private void determineAdviceType() {
AbstractAspectJAdvisorFactory.AspectJAnnotation<?> aspectJAnnotation = AbstractAspectJAdvisorFactory.AspectJAnnotation<?> aspectJAnnotation =
@ -188,7 +191,8 @@ class InstantiationModelAwarePointcutAdvisorImpl
if (aspectJAnnotation == null) { if (aspectJAnnotation == null) {
this.isBeforeAdvice = false; this.isBeforeAdvice = false;
this.isAfterAdvice = false; this.isAfterAdvice = false;
} else { }
else {
switch (aspectJAnnotation.getAnnotationType()) { switch (aspectJAnnotation.getAnnotationType()) {
case AtAfter: case AtAfter:
case AtAfterReturning: case AtAfterReturning:
@ -208,20 +212,20 @@ class InstantiationModelAwarePointcutAdvisorImpl
} }
} }
@Override @Override
public String toString() { public String toString() {
return "InstantiationModelAwarePointcutAdvisor: expression [" return "InstantiationModelAwarePointcutAdvisor: expression [" + getDeclaredPointcut().getExpression() +
+ getDeclaredPointcut().getExpression() "]; advice method [" + this.method + "]; perClauseKind=" +
+ "]; advice method [" this.aspectInstanceFactory.getAspectMetadata().getAjType().getPerClause().getKind();
+ this.method
+ "]; perClauseKind="
+ this.aspectInstanceFactory.getAspectMetadata().getAjType().getPerClause().getKind();
} }
/** /**
* Pointcut implementation that changes its behaviour when the advice is instantiated. Note that * Pointcut implementation that changes its behaviour when the advice is instantiated.
* this is a <i>dynamic</i> pointcut. Otherwise it might be optimized out if it does not at first * Note that this is a <i>dynamic</i> pointcut. Otherwise it might
* match statically. * be optimized out if it does not at first match statically.
*/ */
private class PerTargetInstantiationModelPointcut extends DynamicMethodMatcherPointcut { private class PerTargetInstantiationModelPointcut extends DynamicMethodMatcherPointcut {
@ -231,24 +235,20 @@ class InstantiationModelAwarePointcutAdvisorImpl
private LazySingletonAspectInstanceFactoryDecorator aspectInstanceFactory; private LazySingletonAspectInstanceFactoryDecorator aspectInstanceFactory;
private PerTargetInstantiationModelPointcut( private PerTargetInstantiationModelPointcut(AspectJExpressionPointcut declaredPointcut,
AspectJExpressionPointcut declaredPointcut, Pointcut preInstantiationPointcut, MetadataAwareAspectInstanceFactory aspectInstanceFactory) {
Pointcut preInstantiationPointcut,
MetadataAwareAspectInstanceFactory aspectInstanceFactory) {
this.declaredPointcut = declaredPointcut; this.declaredPointcut = declaredPointcut;
this.preInstantiationPointcut = preInstantiationPointcut; this.preInstantiationPointcut = preInstantiationPointcut;
if (aspectInstanceFactory instanceof LazySingletonAspectInstanceFactoryDecorator) { if (aspectInstanceFactory instanceof LazySingletonAspectInstanceFactoryDecorator) {
this.aspectInstanceFactory = this.aspectInstanceFactory = (LazySingletonAspectInstanceFactoryDecorator) aspectInstanceFactory;
(LazySingletonAspectInstanceFactoryDecorator) aspectInstanceFactory;
} }
} }
@Override @Override
public boolean matches(Method method, Class<?> targetClass) { public boolean matches(Method method, Class<?> targetClass) {
// We're either instantiated and matching on declared pointcut, or uninstantiated matching on // We're either instantiated and matching on declared pointcut, or uninstantiated matching on either pointcut
// either pointcut return (isAspectMaterialized() && this.declaredPointcut.matches(method, targetClass)) ||
return (isAspectMaterialized() && this.declaredPointcut.matches(method, targetClass)) this.preInstantiationPointcut.getMethodMatcher().matches(method, targetClass);
|| this.preInstantiationPointcut.getMethodMatcher().matches(method, targetClass);
} }
@Override @Override
@ -261,4 +261,5 @@ class InstantiationModelAwarePointcutAdvisorImpl
return (this.aspectInstanceFactory == null || this.aspectInstanceFactory.isMaterialized()); return (this.aspectInstanceFactory == null || this.aspectInstanceFactory.isMaterialized());
} }
} }
} }

Loading…
Cancel
Save