在Spring Framework中,我在使用AOP时遇到了一个奇怪的问题。 我有以下简单的bean类用于问候语:
public class HelloBean {
private String message;
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public void displayGreeting() {
System.out.println("Hello");
}
}
春天配置:
<beans>
<bean id="hello" class="com.att.spring.main.HelloBean"/>
<bean id="serviceCheck" class="com.att.spring.main.ServiceCheck" />
<aop:config>
<aop:aspect ref="serviceCheck">
<aop:pointcut id="greet"
expression="execution(* *.getMessage(..))" />
<aop:before pointcut-ref="greet"
method="preRunMessage" />
<aop:after pointcut-ref="greet"
method="postRunMessage" />
</aop:aspect>
</aop:config>
</beans>
AOP建议方法:
public class ServiceCheck {
public void preRunMessage() {
System.out.println("Runs before the greeting");
}
public void postRunMessage() {
System.out.println("Runs after the greeting");
}
}
测试类:
public class Test {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext(
"spring-beans.xml");
HelloBean hello = (HelloBean) context.getBean("hello");
hello.setMessage("Hello World");
System.out.println(hello.getMessage());
}
}
输出:
Runs before the greeting
Runs after the greeting
Hello World
问题:
当我使用getter作为切入点时,为什么两个建议(之前和之后)都会被打印出来。当我在displayGreeting()方法上使用切入点时,该建议正常工作?
答案 0 :(得分:0)
在System.out.println()
之后执行hello.getMessage()
。您可以使用调试器进行检查。
1)preRunMessage()
2)hello.getMessage()
3)postRunMessage()
4)the System.out.println() prints the string returned by hello.getMessage()
尝试在hello.getMessage()
中打印一些内容,它将在运行之前和之后的按摩方法之间打印。