Spring AOP之后的建议在getter函数上无法正常工作

时间:2014-02-19 15:14:00

标签: spring aop getter pointcut

在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()方法上使用切入点时,该建议正常工作?

1 个答案:

答案 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()中打印一些内容,它将在运行之前和之后的按摩方法之间打印。