【问题标题】:Make a check on AOP pointcut expression检查 AOP 切入点表达式
【发布时间】:2011-11-14 10:12:14
【问题描述】:

我需要检查我的切入点表达式,例如。 我有这个豆子:

<bean id="logConfig"
    class="com.celfocus.ufe.base.logging.domains.LoggingConfiguration">
    <property name="logDetails" value="STANDARD" />
    <property name="logLvl" value="COMPLETE" />
</bean>

在我的 aop 切入点表达式中,我需要检查以验证 bean 属性“logLvl”的值。

<aop:config>
    <aop:aspect ref="ufeLogger">
        <aop:pointcut id="complete" expression="execution(* *.*(..)) and bean(logConfig)==COMPLETE" />
        <aop:before pointcut-ref="complete" method="logBefore" />
    </aop:aspect>
</aop:config>

我的表达不灵了……我可以改变什么来做这个检查?

【问题讨论】:

    标签: spring aop expression pointcut


    【解决方案1】:

    是什么让您认为and bean(logConfig)==COMPLETE 是一个有效的切入点? Spring AOP 使用 AspectJ 切入点语法,没有 Spring 添加。此外,您甚至没有引用 logLvl 属性,所以这是否可行?

    不幸的是,要实现这一点,您必须手动实施检查。不过这并没有那么麻烦:只需将logConfig 注入ufeLogger 方面并在logBefore() 方法中添加一个简单的条件。

    【讨论】:

    • 我已经尝试过了,但是当我在 logBefore() 方法中设置条件时,我无法截获我的意思..
    【解决方案2】:

    这是最相关的问题,下面的解决方案。我不时写方面表达式。表达可能不起作用。您需要编写正确的表达式,它将与您的目标方法匹配。我找到了一个简单的决定来检查一切是否清楚:

    @Around(value="execution(* *.find(..))")
    public Entity filterEntity(ProceedingJoinPoint pjp) throws Throwable {
       Entity entity = (Entity) pjp.proceed(); // put breakpoint here
    }
    

    在调试模式下,您可以检查用于匹配表达式的目标方法真实签名,路径为pjp.methodInvocation.method

    我希望这个答案可以节省您查找错误的时间。

    P.S 如果有更好的检查表达式的决定,很高兴看到它

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多