我有自定义注释:
@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();
}
}
}
我遇到的问题是行为似乎不一致。当我从一个不同的类调用一个方法时,这看起来像预期的那样,但如果我调用一个带注释的私有方法,则不会发生拦截。我的配置不正确吗?任何建议将不胜感激。
答案 0 :(得分:1)
来自类内的方法调用不适用于基于代理的AOP。
由于您使用的是关键字this
(它是指向原始对象的指针而不是包装它的代理对象),因此您将直接调用包装方法 - 从而绕过添加为AOP的结果。
答案 1 :(得分:0)
您已通过 java 和 aop 标记了您的问题,而不是 spring 或 spring-aop 。所以我假设您不仅限于基于代理的Spring AOP,而且可以使用像AspectJ这样的完整AOP解决方案(甚至可以在Spring或应用程序服务器中使用)。如果是这样,有一个解决方案:
使用privileged aspect。警告:本机AspectJ语法支持此功能,但not in @AspectJ syntax。