我在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,以便上面的代码不会被执行?我怎么能这样做?
答案 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();
}
}
}