AOP 無介面使用cglib
阿新 • • 發佈:2018-11-14
<?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);
}
}