AspectJ切入点方法仅从特定包执行

时间:2015-04-19 15:04:27

标签: java aop aspectj

我正在尝试通过记录器调用来修改日志消息。由于Logger框架在大多数库中使用,我想只捕获来自特定包的记录器调用。

    @Aspect
    public class LogAspect {

    @Pointcut("within(com.testing.servlet..*) && execution(* org.slf4j.Logger.debug(..))")
        public void logging() {

        }

    @Around("com.testing.aspect.LogAspect.logging()")
        public void around(ProceedingJoinPoint jp) {
            Object[] args = jp.getArgs();
            String modifiedLogMessage = "Appended Log - ";
            for (int i = 0; i < args.length; i++) {
                if (args[i] instanceof String) {
                    modifiedLogMessage += (String) args[i];
                    args[i] = modifiedLogMessage;
                }
            }
            try {
                jp.proceed(args);
            } catch (Throwable e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
}

我尝试了不同的可能性,但它不起作用,
@Pointcut(“within(com.testing.logging。)) - 捕获特定包装下的所有调试调用
@Pointcut(“执行(
org.slf4j.Logger.debug(..))”) - 捕获每个包下的所有调试调用
@Pointcut(“within()&amp;&amp; execution( org.slf4j.Logger.debug(..))”) - 捕获每个包下的所有调试调用
@Pointcut(“in(com .. )&amp;&amp; execution( org.slf4j.Logger.debug(..))”) - 不捕获任何内容

我基本上缺少一些东西并且对如何正确应用切入点感到困惑

aop.xml文件

    <!DOCTYPE aspectj PUBLIC
        "-//AspectJ//DTD//EN" "http://www.eclipse.org/aspectj/dtd/aspectj.dtd">
<aspectj>
    <weaver options="-verbose -showWeaveInfo">
        <!-- <include within="com.testing.*" />
        <include within="org.slf4j.*"/> -->
    </weaver>
    <aspects>
        <aspect name="com.testing.aspect.LogAspect" />
        <!-- <concrete-aspect name="com.testing.aspect._My_AbstractAspect"
            extends="com.testing.aspect.AbstractLogAspect">
            <pointcut name="scope" expression="execution(* org.slf4j.Logger.debug(..))" />
        </concrete-aspect> -->
        <!-- <include within="com.testing.*" /> -->
    </aspects>
</aspectj>

我也在aop.xml中尝试了多个组合,但似乎都没有。 感谢您的帮助

1 个答案:

答案 0 :(得分:0)

我有类似的问题,我认为这可能适合你:

within (com.your.package) && call (* org.slf4j.Logger.debug(..))

可能需要一些稍微不同的调用参数语法。这似乎对我有用。我的具体案例是关于捕获Thread.sleep()的调用,但我只想从我的包中捕获调用,所以我使用了以下内容:

@Around("within (com.mycompany.mypackage) && call (void java.lang.Thread.sleep(long))")

我认为关键的区别在于“执行”正在捕捉到在被叫方发生方法调用的情况,但“呼叫”正在捕捉呼叫方的呼叫。因此,基本上,“执行”发生在“org.slf4j.Logger”包中,因此当您进一步过滤“并在我的包中”时,没有重叠。但是,“调用”发生在您的包(和其他包)中,因此与您的包交叉是有意义的。