当前位置: 首页 > 知识库问答 >
问题:

包含关键字服务的包的执行方法的@AeyJ切入点

梁丘波鸿
2023-03-14

我试图拦截所有在其包名中包含特定单词的类...如下所示:

@Pointcut("execution(* *..service..*.*(..))")

我要拦截包中的所有类:

com.domain.model.user.service.save(User user);
com.domain.model.user.service.impl.save(XPTO xpto);
com.domain.model.foo.service.HelloWorld.getMessage(Foo foo);

简而言之,我想拦截属于

package *service*

我正努力让这项工作从过去的许多天。

共有3个答案

沈俊明
2023-03-14

您应该使用如下切入点表达式:

within(your.base.package..service..*)
  • 至少限制您的基本软件包(通常这不是问题)
  • 在任何级别匹配包名称中的“service”关键字

例如,这将匹配以下类别:

  • your.base.package.service.服务类
  • your.base.package.service.customer.服务类
  • your.base.package.internal.service.服务类
  • your.base.package.internal.service.customer.服务类
欧阳德运
2023-03-14

我认为你可以用这样的切入点捕捉到你需要的东西:

before(): execution(* *(..)) && 
          (within(*..service..*.*) || within(service..*.*) || within(*..service.*)) {}

内三条包含三种选择:

  • 在(*…service..*.*)中:“service”位于包名称中的某个位置,但不在开始或结束处
  • 在(服务..*.*)中:“服务”位于包名称的开头(在您的场景中可能不会发生这种情况)
  • in(*…service.*):“service”位于包名称的末尾

如果您需要捕获serviceFoo的变体,您可以在服务周围添加更多的通配符(我认为):在(*..*service**)

谭学名
2023-03-14

试试这个。也许您必须排除方面类以避免无休止的循环。此示例在包中捕获com... login...*的所有方法

@Aspect
@SuppressAjWarnings({ "adviceDidNotMatch" })
public class AllMethodsAspect {
    private static Map<String, Long> beforeTimestamps = new HashMap<>();

    @Pointcut("!within(aspects..*)"
                    + " && (!execution(* org..*           (..))     && !within(org..*)           && !call(* org..*         (..)) )"
                    + " && (!execution(* java..*          (..))     && !within(java..*)          && !call(* java..*        (..)) )"
                    + " && (!execution(* javax..*         (..))     && !within(javax..*)         && !call(* javax..*       (..)) )"
                    + " && (!execution(* sun..*           (..))     && !within(sun..*)           && !call(* sun..*         (..)) )"
                    + " && execution(* com..login..*(..))")
    public void methodCall() {
    }

    @Before("methodCall()")
    public void before(JoinPoint joinPoint) {
        beforeMethodCall(joinPoint);
    }

    @AfterReturning(pointcut = "methodCall()", returning = "returnObject")
    public void after(JoinPoint joinPoint, Object returnObject) {
        afterMethodCall(joinPoint, returnObject);
    }

    @AfterThrowing(pointcut = "methodCall()", throwing = "throwable")
    public void throwing(JoinPoint joinPoint, Throwable throwable) {
        afterThrowingMethodCall(joinPoint, throwable);
    }

    void beforeMethodCall(JoinPoint joinPoint) {
        try {
            long start = System.currentTimeMillis();
            beforeTimestamps.put(joinPoint.toString() + " - " + Thread.currentThread().getName(), Long.valueOf(start));
            LOG.info(".before " + joinPoint);
        } catch (Exception e) {
            LOG.error(".before Exception " + e);
        }
    }

    void afterMethodCall(JoinPoint joinPoint, Object returnObject) {
        afterMethodCall(joinPoint, returnObject, 0);
    }

    void afterMethodCall(JoinPoint joinPoint, Object returnObject, int depth) {
        try {
            long start = beforeTimestamps.get(joinPoint.toString() + " - " + Thread.currentThread().getName()).longValue();
            beforeTimestamps.remove(joinPoint.toString() + " - " + Thread.currentThread().getName());

            long duration = System.currentTimeMillis() - start;
            Signature signature = joinPoint.getSignature();
            if (signature instanceof MethodSignature) {
                Class<?> returnType = ((MethodSignature) signature).getReturnType();
                LOG.info(".after " + joinPoint + " " + duration + "ms" + (void.class == returnType ? "" : " [" + returnObject + "]"));
            } else if (signature instanceof ConstructorSignature) {
                LOG.info(".after " + joinPoint + " " + duration + "ms Constructor");
            } else if (signature instanceof FieldSignature) {
                LOG.info(".after " + joinPoint + " " + duration + "ms Field");
            } else {
                LOG.info(".after " + joinPoint + " " + duration + "ms unknown");
            }
        } catch (Exception e) {
            LOG.error(".after Exception " + e);
        }
    }

    void afterThrowingMethodCall(JoinPoint joinPoint, Throwable throwable) {
        try {
            Long startAsLong = beforeTimestamps.get(joinPoint.toString() + " - " + Thread.currentThread().getName());
            long start = startAsLong == null ? 0 : startAsLong.longValue();
            beforeTimestamps.remove(joinPoint.toString() + " - " + Thread.currentThread().getName());

            long duration = System.currentTimeMillis() - start;
            LOG.info(".fail " + joinPoint.toString() + " " + duration + " ms - " + throwable.getMessage());
        } catch (NullPointerException e) {
            LOG.info(".fail NullPointerException " + "unknown - " + throwable.getMessage());
        }
    }

    static final class LOG {
        static void info(String loggingData) {
            System.err.println(new Date() + " " + loggingData);
        }

        static void error(String loggingData) {
            System.err.println(new Date() + " " + loggingData);
        }
    }
}
 类似资料:
  • 我有一个特定包的工作代码,但我想为所有控制器、服务和dao包配置它,例如 com。abc。xyz。所容纳之物控制器 com。abc。xyz。所容纳之物服务 com。abc。xyz。所容纳之物道 com。abc。xyz。类别控制器 com。abc。xyz。类别服务 com。abc。xyz。类别dao公司 等等这是我的项目的基本包,有人可以帮助我如何去做它,使它适用于我的网络项目,包括控制器的所有类,

  • 问题内容: 有没有类似于Go中的方法的东西,而不必搜索切片中的每个元素? 问题答案: Mostafa已经指出,编写这种方法很简单,而mkb为您提供了使用sort包中的二进制搜索的提示。但是,如果要进行很多此类包含检查,则还可以考虑使用地图。 使用惯用语检查特定的映射键是否存在很简单。由于您对值不感兴趣,因此也可以创建一个例如。在此处使用空值的优点是不需要任何额外的空间,并且Go的内部映射类型针对该

  • 是否有类似于方法,而不必搜索片中的每个元素?

  • 本文向大家介绍python提取包含关键字的整行数据方法,包括了python提取包含关键字的整行数据方法的使用技巧和注意事项,需要的朋友参考一下 问题描述: 如下图所示,有一个近2000行的数据表,需要把其中含有关键字‘颈廓清术,中央组(VI组)'的数据所在行都都给抽取出来,且提取后的表格不能改变原先的顺序。 问题分析: 一开始想用excel的筛选功能,但是发现只提供单列筛选,由于关键词在P,S,V

  • 怎么了?各位! 我正在尝试拦截所有名称中包含特定单词的类...如下所示: 我有以下拦截方法: 我试过:(有效,但看起来很可怕) 谢谢!!!

  • 问题内容: 有没有一种方法可以选择其中一列仅包含,但包含任意数量的预定义值的行? 我一直在使用它,但是它返回的行中我的列至少包含一个值(我知道这正是它应该做的)。 但我正在寻找一种方法,仅选择在关键字列中仅包含我的关键字的行。 关键字示例: 使用上述关键字,我希望返回前两个结果,而不是后两个: 我的专栏包含用逗号分隔的适用于该产品行的所有关键字的列表。 问题答案: 由于您将列表存储为包含逗号分隔列