1、class MyAfterReturningAdvice
package com.aop10;
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("执行后置通知方法");
}
}
2、class MyTest
package com.aop10;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MyTest {
public static void main(String[] args) {
String resource = "com/aop10/applicationContext.xml";
ApplicationContext ac = new ClassPathXmlApplicationContext(resource);
ISomeService service = (ISomeService) ac.getBean("someService");
service.doFirst();
System.out.println("------------------------------------");
service.doSecond();
System.out.println("------------------------------------");
service.doThird();
System.out.println("-----------------------------------------------------------------------");
ISomeService service2 = (ISomeService) ac.getBean("someService2");
service2.doFirst();
System.out.println("------------------------------------");
service2.doSecond();
System.out.println("------------------------------------");
service2.doThird();
}
}
3、applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?><!-- 注册目标对象 -->
<bean id="someService" class="com.aop10.SomeServiceImpl"/>
<bean id="someService2" class="com.aop10.SomeServiceImpl"/>
<!-- 注册切面:通知 -->
<bean id="myAdvice" class="com.aop09.MyAfterReturningAdvice"/>
<!-- 注册切面:顾问 -->
<bean id="myAdvisor" class="org.springframework.aop.support.NameMatchMethodPointcutAdvisor">
<property name="advice" ref="myAdvice"/>
<property name="mappedName" value="doFirst"/>
</bean>
<!-- 生成代理对象:默认顾问自动代理生成器 -->
<bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
<property name="beanNames" value="someService"/>
<property name="interceptorNames" value="myAdvisor"/>
</bean>
<!--
DefaultAdvisorAutoProxyCreator:存在三个问题
1)不能选择目标对象
2)不能选择切面类型,切面只能是顾问
3)不能选择顾问,所有顾问均被作为切面织入到目标方法
-->