Spring AOP表达式已执行但不应该执行

问题描述 投票:0回答:2

我是Spring的新手并试图了解AOP。这就是我得到的

我有一个简单的方面,我想在调用任何非getter方法时运行

@Aspect
@Component
public class LoggingAspect {

    @Pointcut("execution(* org.practice.entity.Person.get*())")
    private void getter() {}

    @Before("!getter()")
    public void noGetter() {
        System.out.println("NO GETTER GETS CALLED");
    }
}

人类很简单

@Component
public class Person {
    public void getPerson() {
        System.out.println("GETTING PERSON....");
    }
 }

我正在使用Java注释初始化配置

@Configuration
@EnableAspectJAutoProxy
@ComponentScan("org.practice")
public class DemoConfig {}

然后在我的主要方法中

public class MyApp {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(DemoConfig.class);
        context.close();
    }
}

正如您所看到的,我只是创建一个上下文并关闭它而不是调用任何getter或非getter方法。当我运行程序时,我得到了以下控制台输出

NO GETTER GETS CALLED....

这是半意义的,因为我没有调用任何getter方法,但我希望这个方面只有在我明确调用任何非getter时才执行,而不仅仅是打开上下文。如果我希望我的业务逻辑只有在调用任何非getter方法时才能执行,请告诉我,那我该怎么做呢?

谢谢

java spring spring-aop
2个回答
1
投票

试试这个:

@Pointcut("execution(* org.practice.entity.Person.*())")
     private void methodCall() {}

@Before("!getter() && methodCall")
    public void noGetter() {
        System.out.println("NO GETTER GETS CALLED");
    }

1
投票

我认为它是在应用程序上下文加载时初始化Person bean期间发生的因为你给了joinpoint而不是getter所以在默认构造执行时(由编译器提供),建议被触发

© www.soinside.com 2019 - 2024. All rights reserved.