我是Spring AOP的新手并尝试使用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");
}
}
}
Context 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>
App.java
public class App
{
public static void main( String[] args )
{
ApplicationContext context = new ClassPathXmlApplicationContext("spring-context.xml");
Employee empl = (Employee)context.getBean("employee");
System.out.println("Employee Names: " + empl.getName());
}
}
我得到的o / p是:
打印前!!! 姓名:XXX 打印后!!! 员工姓名:null
为什么最后一个为空?
答案 0 :(得分:1)
实现这一目标的一种方法是进行这些更改:
XML:
<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!!!");
}
换句话说,您可以访问target
,这是要为其应用的AOP建议而被代理的对象。
答案 1 :(得分:0)
以下代码中的Point.proceed()负责代码的实际执行,并且当您使用周围的建议时,您应该捕获返回值并返回以下方法。 因为你在下面的方法中什么也没有回来它就是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;
}