Java Spring AOP:在aspect方法中传递参数
我是SpringAOP新手,尝试使用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
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;
}