我们可以根据任何标志的值或通过配置文件启用或禁用Aspect吗?

时间:2015-04-02 06:16:16

标签: java aspectj spring-aop

我在pom.xml中添加了以下依赖项

<dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aop</artifactId>
            <version>${spring.version}</version>
        </dependency>

        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjrt</artifactId>
            <version>1.8.5</version>
        </dependency>

        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>1.8.5</version>
        </dependency>

在appContext.xml中启用AspectJ,如下所示:

并定义方面如下:

@Component
@Aspect
public class AuthenticationServiceAspect {


@Before("execution(* com.service.impl.AuthenticationServiceImpl.*(..))")
    public void adviceMethod(JoinPoint joinPoint) {

        if(true){
            throw new Exception();
        }


}

现在我想禁用这个AOP,以便上面的代码不会被执行?我怎么能这样做?

3 个答案:

答案 0 :(得分:12)

您可以使用带有ConditionalOnExpression批注的属性的启用/禁用组件。当组件被禁用时,方面也是如此。

@Component
@Aspect
@ConditionalOnExpression("${authentication.service.enabled:true}")// enabled by default
public class AuthenticationServiceAspect {
    @Before("execution(* com.service.impl.AuthenticationServiceImpl.*(..))")
    public void adviceMethod(JoinPoint joinPoint) {
        if(true){
            throw new Exception();
        }
    }
}

要禁用方面,只需将 authentication.service.enabled = false 添加到您的application.properties。

答案 1 :(得分:1)

看起来Spring不支持AspectJ的if()切入点原语。

  

引起:org.springframework.beans.factory.BeanCreationException:创建名为'foo'的bean时出错:bean的初始化失败;嵌套异常是org.aspectj.weaver.tools.UnsupportedPointcutPrimitiveException:切入点表达式'execution(* doSomething(..))&amp;&amp; if()'包含不支持的切入点原语'if'

答案 2 :(得分:-1)

始终有if()切入点表达式,允许您定义要通过建议检查的条件: https://www.eclipse.org/aspectj/doc/next/adk15notebook/ataspectj-pcadvice.html#d0e3697

而且......你的方面已经是一个Spring @Component。为什么不通过@Value注入属性并决定它们是否应该执行你的建议?您可以通过上面描述的if()切入点执行此操作,也可以只检查通知中的值并执行或跳过它。

@Component
@Aspect
public class AuthenticationServiceAspect {

    @Value("${aspect.active}")
    private boolean active = true;

    @Pointcut("execution(* com.service.impl.AuthenticationServiceImpl.*(..)) && if()")
    public static boolean conditionalPointcut() {
        return active;
    }

    @Before("conditionalPointcut()")
    public void adviceMethod(JoinPoint joinPoint) {
        if(true){
            throw new Exception();
        }
    }
}