【问题标题】:AspectJ pointcut method execution only from specific packages仅从特定包执行 AspectJ 切入点方法
【发布时间】:2015-04-19 15:04:27
【问题描述】:

我正在尝试应用有关记录器调用的建议来修改日志消息。由于大多数库中都使用了 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("execution(
org.slf4j.Logger.debug(..))") - 捕获每个包下的所有调试调用
@Pointcut("within() && execution( org.slf4j.Logger.debug(..))") - 捕获每个包下的所有调试调用
@Pointcut("within(com..) && 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 中尝试了多种组合,但似乎没有一个有效。 提前感谢您的帮助

【问题讨论】:

  • 您是否尝试过在切入点中使用“调用”而不是“执行”?不能告诉你确切的原因,但它对我有用......

标签: java aop aspectj


【解决方案1】:

我遇到了类似的问题,我认为这可能对您有用:

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

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

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

我认为关键的区别在于“执行”是在被调用方捕获对方法的调用,而“调用”是在调用方捕获调用。因此,本质上,“执行”发生在“org.slf4j.Logger”包内,因此当您通过“和我的包内”进一步过滤时,没有重叠。但是,“调用”发生在您的包(和其他包)中,因此与您的包相交确实有意义。

【讨论】:

    猜你喜欢
    • 2011-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多