使用AOP拦截私有注释方法

时间:2014-11-14 13:29:08

标签: java aop

我有自定义注释:

@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface FeatureSwitch {

    String featureName();

}

我用以下方面拦截它并用它来检查功能是打开还是关闭。如果该功能关闭,那么我会抛出异常。

方面:

@Aspect
public class FeatureSwitchAspect {

    private final FeatureSwitchConfigurationApi featureSwitchConfigurationApi;

    public FeatureSwitchAspect(final FeatureSwitchConfigurationApi featureSwitchConfigurationApi) {
        this.featureSwitchConfigurationApi = featureSwitchConfigurationApi;
    }

    @Before("@annotation(featureSwitch)")
    public void checkFeatureSwitch(final FeatureSwitch featureSwitch) {
        final String featureName = featureSwitch.featureName();
        Boolean featSwitch = featureSwitchConfigurationApi.isFeatureActive(featureName);
        if (!featSwitch) {
            throw new FeatureSwitchOffException();
        }
    }
}

我遇到的问题是行为似乎不一致。当我从一个不同的类调用一个方法时,这看起来像预期的那样,但如果我调用一个带注释的私有方法,则不会发生拦截。我的配置不正确吗?任何建议将不胜感激。

2 个答案:

答案 0 :(得分:1)

来自类内的方法调用不适用于基于代理的AOP。

由于您使用的是关键字this(它是指向原始对象的指针而不是包装它的代理对象),因此您将直接调用包装方法 - 从而绕过添加为AOP的结果。

答案 1 :(得分:0)

您已通过 java aop 标记了您的问题,而不是 spring spring-aop 。所以我假设您不仅限于基于代理的Spring AOP,而且可以使用像AspectJ这样的完整AOP解决方案(甚至可以在Spring或应用程序服务器中使用)。如果是这样,有一个解决方案:

使用privileged aspect。警告:本机AspectJ语法支持此功能,但not in @AspectJ syntax