【问题标题】:How to provide dynamic pointcut in AspectJ?如何在 AspectJ 中提供动态切入点?
【发布时间】:2015-09-21 15:09:17
【问题描述】:

我正在尝试构建一个自定义性能测量库,用户可以使用它来测量应用程序中任何方法的性能。我的目标是在不改变用户应用程序现有 Java 代码的情况下实现这件事。

库将使用MethodInterceptor 实现作为衡量性能的建议。 用户的唯一输入将是他/她选择的切入点表达式,没有别的。并且使用提供的切入点表达式,我的库将能够拦截匹配的方法调用来衡量性能。

简而言之,用户只会在 spring xml 中进行如下配置:

<bean id="configBean" class="com.something.PointCutConfigBean">
    <property name="patterns">
        <list>
            <value>"execution(* com.company.CustomerDao.addCustomer(..))"</value>
        </list>
    </property>
</bean>

我的问题是如何在我的库中实现这一点?如何实现PointCutConfigBean 类?我可以使用 spring 2 和 aspectj。

我知道,如果用户只写一个普通的&lt;aop:config 并使用我的建议,同样的事情也可以实现。但如果可能的话,我只是在寻找更酷的东西。

【问题讨论】:

  • 我看看我前段时间问的this问题,你可能会发现它很有用...
  • @XtremeBiker 谢谢。这很好,但我想提供多个切入点表达式作为列表属性而不是注释。这就是动态需求出现的地方,因此也是挑战:)
  • 你试过aop:pointcut符号吗?它应该做你想做的......
  • @XtremeBiker aop:config, aop:pointcut 是我知道的常用方式。正如我在问题中提到的,我正在寻找一种替代方式,为用户减少配置开销。
  • 如果它是一个常规方面,它应该是不可知的。对于没有弹簧的使用,您将/可以在 aop.xml 中指定由 AspectJ 指定的表达式。尝试将它与 spring 集成也可能很困难,如果你做错了,甚至会破坏正常运行的软件,因为当做错时很容易触发围绕代理创建代理。

标签: java spring aop aspectj


【解决方案1】:

这是个好问题!

你为什么不创建一个注解,如果你需要标记方法或字段,并写一个可以获取注解的切面。 Class.getAnnotations(),如果你的注解存在,你运行你的代码?

【讨论】:

  • 这将涉及更改 Java 代码,我认为这是 OP 不想...
  • 没错,但这是一个不错的方法。您是否尝试“执行(* package1.*.*(..)) || 执行(* package2.*.*(..))”
  • 您发布的内容应该是问题下方的评论,IMO。
  • 你是对的!是的,AspectJ 在 spring 2 上工作得很好我在一个项目上做了,但是你需要指定 java 代理,并在 java 命令行上声明编织。
【解决方案2】:

在审查了可能的方法后,我认为@M.Deinum 的评论对我的决定最有价值。最后,我决定只选择&lt;aop:advisor advice-ref="..." pointcut="execution(.. 路线。

如果有人有其他看法,请分享。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-25
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    相关资源
    最近更新 更多