我是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方法时执行才能告诉我,那我该怎么做呢?
由于
答案 0 :(得分:1)
试试这个:
@Pointcut("execution(* org.practice.entity.Person.*())")
private void methodCall() {}
@Before("!getter() && methodCall")
public void noGetter() {
System.out.println("NO GETTER GETS CALLED");
}
答案 1 :(得分:1)
我认为它是在应用程序上下文加载时初始化Person bean的过程中发生的 既然你没有给getter提供joinpoint,那么在默认构造执行时(由编译器提供),建议就会被触发