当前位置: 首页 > 知识库问答 >
问题:

Spring AOP在getter函数上不能正常工作后

杜俊爽
2023-03-14

在Spring框架中,我在使用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");
    }
}

下面是spring配置:

<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作为切入点时,为什么两个建议(之前和之后)都被打印出来。建议工作正确时,我使用点切入点displayGreting()方法??

共有1个答案

严修德
2023-03-14

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()中打印某些内容,它将在运行前和运行后消息方法之间打印。

 类似资料:
  • 我正在使用OpenCV重塑函数,以便将25行1列的Mat(因此我们有25个数据值)重塑为5行5列的Mat。

  • 我有以下scala类和带注释的aspectj类: 函数栏工作得很好,但函数foo不行。没有任何错误,似乎函数“foo”的执行没有被捕获。

  • 我正试图在按下某个按钮时弹出一个警报对话框。我首先使用了Android Developer的示例代码而不是'这不起作用,所以我根据在这个站点上发现的情况进行了更改,但是现在我的程序在按下按钮后被迫停止。 就你的知识而言,这是在第二个不同于主要的活动中完成的。不确定这是否重要.... ‘ 碰撞日志:“03-25 19:34:24.373:E/AndroidRuntime(18828):致命异常:ma

  • 2,错误{org.apache.directory.server.LDAP.ldapserver}-ERR_171无法将LDAP服务(10,389)绑定到服务注册表。java.net.BindException:已在使用的地址 请帮忙谢谢 --------提示------------------- JAVA_HOME环境变量设置为/opt/java CARBON_HOME环境变量设置为/mnt/1

  • 我一直在尝试创建一个功能类似图书馆系统的web应用程序,目前我正在构建一个将显示系统中所有书籍的表。但是,在我关闭第一个echo语句以开始用HTML构建表之后,应用程序似乎不再将其视为代码,而是将PHP代码的其余部分打印到屏幕上。 下面是所讨论的代码: 我显然对PHP不太精通,所以我不知道问题是什么。