Java 使用AOP截获私有带注释的方法

Java 使用AOP截获私有带注释的方法,java,aop,Java,Aop,我有一个自定义注释: @Target({ElementType.METHOD, ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) public @interface FeatureSwitch { String featureName(); } 我用下面的方面截取它,并用它来检查某个功能是否打开或关闭。如果功能关闭,则抛出异常 方面: @Aspect public class FeatureSwitchAspect {

我有一个自定义注释:

@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();
        }
    }
}

我遇到的问题是,这种行为似乎前后不一致。当我从另一个类调用一个方法时,这似乎和预期的一样,但是如果我调用一个带注释的私有方法,就不会发生截获。我的配置有误吗?任何建议都将不胜感激。

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


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

您已经通过java和AOP标记了问题,而不是通过spring或spring AOP。因此,我假设您不仅限于基于代理的SpringAOP,还可以使用成熟的AOP解决方案,如AspectJ(甚至可以在Spring或应用服务器中使用)。如果是这样,有一个解决方案:


使用一个。警告:本机AspectJ语法支持这一点,但是。

根据您的aop解决方案,您使用的是代理。在这种情况下,只有对对象的方法调用在通过代理时被拦截。内部调用不通过代理。如果你想拦截内部方法调用,你必须为你的项目设置加载或编译时编织。谢谢你的提醒。我将不得不为类内方法的调用想出一个替代方案。谢谢大家的提醒。我将不得不为类内方法的调用想出一个替代方案。在最初的问题中,没有人提到任何关于基于代理的AOP的内容。看看我自己的答案。谢谢你的提醒。这看起来很有希望。这是如何初始化的?组件扫描似乎不起作用。弹簧手册,第9.8章: