1、Class MyAfterRetuningAdvice
package com.aop02;
import java.lang.reflect.Method;
import org.springframework.aop.AfterReturningAdvice;
//后置通知:可以获取目标方法的返回结果,但无法改变目标方法的结果
public class MyAfterReturningAdvice implements AfterReturningAdvice {
//在目标方法执行之后执行
//returnValue:目标方法的返回值
@Override
public void afterReturning(Object returnValue, Method method, Object[] args, Object target) throws Throwable {
System.out.println("执行后置通知方法 returnValue = " + returnValue);
String resultString;
if (returnValue != null) {
resultString = ((String) returnValue).toUpperCase();
System.out.println("修改之后的返回值returnValue = " + resultString);
}
}
}
2、Class MyTest
package com.aop02;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MyTest {
public static void main(String[] args) {
String resource = "com/aop02/applicationContext.xml";
ApplicationContext ac = new ClassPathXmlApplicationContext(resource);
ISomeService service = (ISomeService) ac.getBean("serviceProxy");
service.doFirst();
System.out.println("------------------------------------");
String result = service.doSecond();
System.out.println(result);
}
}
3、applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- 注册目标对象 -->
<bean id="someService" class="com.aop02.SomeServiceImpl"/>
<!-- 注册切面 -->
<bean id="myAdvice" class="com.aop02.MyAfterReturningAdvice"/>
<!-- 生成代理对象 -->
<bean id="serviceProxy" class="org.springframework.aop.framework.ProxyFactoryBean">
<!-- 指定目标对象 -->
<property name="target" ref="someService"/>
<!-- 指定切面 -->
<property name="interceptorNames" value="myAdvice"/>
</bean>
</beans>