<?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.gqc.aop07.SomeService"/>
<!-- 註冊切面:後置通知 -->
<bean id="myAdvice" class="com.gqc.aop07.MyAfterReturningAdvice"/>
<!-- 生成代理對象 -->
<bean id="serviceProxy" class="org.springframework.aop.framework.ProxyFactoryBean">
<!-- 指定目標對象 -->
<property name="target" ref="someService"/>
<!-- <property name="targetName" value="someService"/> -->
<!-- 指定切面 -->
<property name="interceptorNames" value="myAdvice"/>
</bean>
</beans>
package com.gqc.aop07;
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);
if(returnValue!=null){
returnValue=((String)returnValue).toUpperCase();
}
}
}
package com.gqc.aop07;
import com.gqc.utils.SystemService;
//目標類
public class SomeService {
public void doFirst() {
SystemService.doTx();
System.out.println("執行doFirst()");
SystemService.doLog();
}
public String doSecond() {
System.out.println("執行doSecond()");
return "adbc";
}
}
package com.gqc.aop07;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MyTest {
@Test
public void test01() {
//創建容器對象 加載Spring 配置文件
String resource = "com/gqc/aop07/appliactionContext.xml";
ApplicationContext ac=new ClassPathXmlApplicationContext(resource);
SomeService service=(SomeService)ac.getBean("serviceProxy");
service.doFirst();
System.out.println("-----------------");
String result = service.doSecond();
System.out.println(result);
}
}