首先创建maven项目,加入spring依赖,加入aspectj依赖,创建接口,创建目标类,创建切面,在切面中加入后置通知,修改返回值,运行观察方法的返回值是否被改变。
1:原来的目标方法:
@Override
public Student doOther2() {
return new Student(12,"lisi");
}
2:后置通知:
@AfterReturning(value = "execution(* *..SomeServiceImpl.doOther2(..))",returning = "res")
/*
注意,这里也可以用JoinPoint,但是必须位于参数列表的第一位,不然是会报错的
*/
public void myAfterReturning2(JoinPoint joinPoint,Object res){
System.out.println(joinPoint.getSignature());
System.out.println("方法原先的返回值:"+res);
//res = new Student(122,"wangwu");
((Student)res).setName("李菲");
/**
* 如果res是一个对象,那么这里也不会导致返回值的结果发生变化。
*/
System.out.println("将目标方法的返回值修改为:"+ res);
}
3:方法运行:
@Test
public void test03(){
String config = "applicationContext.xml";
ApplicationContext ac = new ClassPathXmlApplicationContext(config);
SomeService proxy = (SomeService) ac.getBean("someService");
System.out.println("目标方法最终的返回值:"+proxy.doOther2());
}
4:返回的结果:
方法原先的返回值:Student{id=12, name='lisi'}
将目标方法的返回值修改为:Student{id=12, name='李菲'}
目标方法最终的返回值:Student{id=12, name='李菲'}
结论:spring中在后置通知中修改引用类型的返回值会影响最后的返回值。
注意:在后置通知中要修改原来的引用的值,而不是仅仅将参数形参res指向一个新的对象,不然你都没有修改原来的返回值那返回值肯定是不会被影响了,这种测试方法就是不对的,结论当然也不对了,所以要注意。