如何从aspectj中排除方法

时间:2013-12-30 07:53:13

标签: aop aspectj spring-aop

我正在尝试使用aspectj从日志文件中排除多个方法(我只使用spring和Load-time编织)。有没有办法列出aop.xml中的排除方法?我知道我可以为全班做这个,但我正在寻找具体的方法。或者我可以在方面类中列出一个列表? 感谢

2 个答案:

答案 0 :(得分:12)

我不知道如何在XML中执行此操作,但是在方面本身中这样做很容易,因为可以使用布尔运算符组合切入点。

传统的aspectj语法:

pointcut whatIDontWantToMatch() : within(SomeClass+) || execution(* @SomeAnnotation *.*(..));
pointcut whatIWantToMatch()     : execution(* some.pattern.here.*(..));
pointcut allIWantToMatch()      : whatIWantToMatch() && ! whatIDontWantToMatch();

@AspectJ语法:

@Pointcut("within(SomeClass+) || execution(* @SomeAnnotation *.*(..))")
public void whatIDontWantToMatch(){}
@Pointcut("execution(* some.pattern.here.*(..))")
public void whatIWantToMatch(){}
@Pointcut("whatIWantToMatch() && ! whatIDontWantToMatch()")
public void allIWantToMatch(){}

这些当然只是样品。 whatIDontWantToMatch()也可以由几个切入点等组成。

答案 1 :(得分:0)

以下是在aspectj中排除基于aop.xml或aop-ajc.xml的方法的方法

<aspectj>
<aspects>
<aspect name="com.perf.aspects.EJBAspect"/>
    <concrete-aspect name="com.perf.aspects.ConcreteAspectEJBInclude" extends="com.perf.aspects.EJBAspect">
    <pointcut name="ejbPointCutInclude"
        expression="execution(* com.perf.test.TestClass..*(..))" /> 
       <!-- Methods to exclude for the above execution methods in TestClass. This will also exclude all calls below excluded method -->
     <pointcut name="ejbPointCutExclude"
        expression="(execution(* com.perf.test.TestClass.getName(..))) || (execution(* com.perf.test.TestClass.getCity(..))) || cflow(execution(* com.perf.test.TestClass.getCity(..))) || cflow(execution(* com.perf.test.TestClass.getName(..))) " /> 
    </concrete-aspect>               
</aspects>
</aspectj>

创建以下抽象方面

public abstract  aspect EJBAspect 
{

    public pointcut ejbPointCutInclude();
    public pointcut ejbPointCutExclude(): ;     


    before() : ejbPointCutInclude() &&  !ejbPointCutExclude() 
    {               
        doBefore(thisJoinPointStaticPart.getSignature());       
    }

    after() :  ejbPointCutInclude() && !ejbPointCutExclude() 
    {               
        doAfter(thisJoinPointStaticPart.getSignature());
    }
}