避免Spring AOP中的就地切入点表达式

Vee*_*era 3 java aop spring

我正在使用Spring AOP.我正在给我的切入点:

@Pointcut("execution(* com.demo.Serviceable+.*(..))")
public void serviceMethodCalls() {
}
Run Code Online (Sandbox Code Playgroud)

是否有可能避免Spring AOP中的就地切入点表达式?

Oli*_*ohm 7

这取决于你选择Spring的AOP风格.当您坚持使用基于注释的方法时,除了具有位于外部类中的表达式的常量之外,您可以获得的内容并不多.

这是由于基于@Aspect注释的AOP风格致力于共存地点内容.您可以通过使用抽象方法并将切入点绑定到它来以某种方式获得一些可配置性.

@Aspect
public abstract class MyAspect {

  protected abstract pointcut();


  @Before("pointcut()")
  public void myAdviceMethod() {
    // Advice code goes here
  }
}


public class ConcreteAspect extends MyAspect {

  @Pointcut("execution(* com.acme.*.*(..))")
  protected pointcut() {
  )
}
Run Code Online (Sandbox Code Playgroud)

这是可能的,但对我来说似乎很尴尬,因为实现者必须知道该方法@Pointcut必需的.如果她忘记放置它,它将完全崩溃.

如果您需要灵活地将建议和切入点分开,则最好坚持使用基于XML的配置(例如,请参阅Spring文档).

中间的一种人可以将切入点与自定义注释联系起来,让用户决定将其放置在何处,从而何时应用您的建议.Spring文档(第6.2.3.4章)提供了更多信息.

此致,奥利