Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring AOP:在aspect方法中传递参数_Java_Spring_Aspectj_Spring 3 - Fatal编程技术网

Java Spring AOP:在aspect方法中传递参数

Java Spring AOP:在aspect方法中传递参数,java,spring,aspectj,spring-3,Java,Spring,Aspectj,Spring 3,我是SpringAOP新手,尝试使用AOP:around创建一个演示 一个简单的bean类: public class Employee { private String name; public String getName() { System.out.println("Name: " + name); return name; } public void setName(String name) { this.name = name; } } 方面实现: pub

我是SpringAOP新手,尝试使用
AOP:around
创建一个演示

一个简单的bean类:

public class Employee {

private String name;
public String getName() {
    System.out.println("Name: " + name);
    return name;
}
public void setName(String name) {
    this.name = name;
}
}
方面实现:

public class PrintingAspect {

public void performPrinting(ProceedingJoinPoint point){
    try {
        System.out.println("Before Printing!!!");
        point.proceed();        
        System.out.println("After Printing!!!");
    } catch (Throwable e) {         
        System.out.println("Exception Printing");
    }
}
}
上下文XML:

<bean id="aspect" class="com.aop.aspect.PrintingAspect">        
</bean>    
<bean id="employee" class="com.aop.model.Employee">
    <property name="name" value="XXX"></property>
</bean>
<aop:config>
    <aop:pointcut id="empName" expression="execution(* com.aop.model.Employee.getName(..))"/>
    <aop:aspect ref="aspect">            
        <aop:around pointcut-ref="empName" method="performPrinting"/>
    </aop:aspect>
</aop:config>
我得到的o/p是:

打印前!!! 姓名:XXX 打印后!!! 员工姓名:空


为什么最后一个为空?

一种方法是进行以下更改:

XML:

换句话说,您可以访问
目标
,该目标是要应用AOP建议的代理对象。

点。下面代码中的继续()负责实际执行代码,当您使用around建议时,您应该捕获返回值并在下面的方法中返回。 由于您在下面的方法中不返回任何内容,因此它将显示为null

请让我知道,如果它不工作。我没有测试它,但它会工作

public void performPrinting(ProceedingJoinPoint point){
    try {
        System.out.println("Before Printing!!!");
        Object returnValue = point.proceed();        
        System.out.println("After Printing!!!");
    } catch (Throwable e) {         
        System.out.println("Exception Printing");
    }
return returnValue;
}

哪个
Employee
对象应该用作参数?发布在顶部的bean类是一个类。您希望传递什么对象?由
bean
声明创建的实例?是的,我希望它被传递。您总是以循环结束,因为您的方面位于方面内部调用的
getName
方法上,再次触发方面,它再次调用
getName
…等。但是要访问
员工
,您需要修改切入点。尝试执行
execution(*com.aop.model.Employee.getName(..)和此(emp)
,您可能需要将
arg names=“emp”
添加到
,具体取决于方法参数名称是否仍然可用。@用户愿意编辑您的问题并在那里添加代码。完成。我已经添加了代码以及我在执行过程中得到的o/p。@user182944发生这种情况是因为您使切入点的返回类型为
null
。因此,
procedure
的返回值被忽略,它是
getName()
的返回值。apsect必须返回一些东西,但它只有
null
@user182944我稍后可能会发布它,但是有更多类型安全的方法可以做到这一点:一点改进:您可以绑定
目标()
添加一个参数,不要一直调用getter。谢谢你的示例,但在你发布之前我已经尝试过这个put。看看你的代码,肯定不行。原因:1)您的方法有一个void返回类型,但仍然返回一个对象。2) 在try块外声明对象,否则返回时该变量将不可见。但是我忽略了这个错误,因为它不在这个上下文中。对于这个错误我很抱歉,我的目的是告诉这个方法应该有一些返回类型。
<aop:pointcut id="empName"
        expression="execution(* com.example.Employee.getName(..))" />
public void performPrinting(ProceedingJoinPoint jp) { // Here empl is coming null
    System.out.println("Before Printing!!!");
    System.out.println(((Employee)jp.getTarget()).getName()); // empl is coming as NULL
    System.out.println("After Printing!!!");
}
public void performPrinting(ProceedingJoinPoint point){
    try {
        System.out.println("Before Printing!!!");
        Object returnValue = point.proceed();        
        System.out.println("After Printing!!!");
    } catch (Throwable e) {         
        System.out.println("Exception Printing");
    }
return returnValue;
}