aop編程之前置通知
阿新 • • 發佈:2017-12-03
his alt rate static 4.2 private oid www. out
aop( Aspect-Oriented Programming)前置通知原理案例講解
編程步驟;
- 定義接口
- 編寫對象(被代理的對象即目標對象)
- 編寫通知(前置通知即目標方法調用前調用)
- 在beans.xml文件中配置
4.1. 配置 被代理對象即目標對象
4.2. 配置通知
4.3. 配置代理對象 其是ProxyFactoryBean的對象實例
4.3.1 配置代理接口集
4.3.2 織入通知
4.3.3 配置被代理對象
直接上代碼
1.分別創建兩個接口如下:
TestServiceInterface.java接口
1 package com.LHB.aop; 2 3 public interface TestServiceInterface { 4 5 public void sayHello(); 6 }
TestServiceInterface2.java接口
1 package com.LHB.aop; 2 3 public interface TestServiceInterface2 { 4 5 publicvoid sayBye(); 6 }
2. 創建被代理對象(目標對象)類testService.java,該類實現了TestServiceInterface和TestServiceInterface2兩個接口方法
1 package com.LHB.aop; 2 3 public class testService implements TestServiceInterface,TestServiceInterface2 { 4 5 private String name; 6 public String getName() { 7 returnname; 8 } 9 public void setName(String name) { 10 this.name = name; 11 } 12 @Override 13 public void sayHello() { 14 // TODO Auto-generated method stub 15 16 System.out.println("hello " + name); 17 } 18 @Override 19 public void sayBye() { 20 // TODO Auto-generated method stub 21 System.out.println("Bye "+ name); 22 } 23 24 }
3. 編寫前置通知即MyMethodBeforeAdvice.java,該類實現了MethodBeforeAdvice接口中的before(method method,Object[] args,Object target )方法。
註意:在實現該接口的時候需要導入spring-aop-5.0.1.RELEASE.jar包(本案例在spring5.0.1版本下實現的)
1 package com.LHB.aop; 2 3 import java.lang.reflect.Method; 4 5 import org.springframework.aop.MethodBeforeAdvice; 6 7 public class MyMethodBeforeAdvice implements MethodBeforeAdvice { 8 9 /** 10 * 功能:該函數將在目標函數執行前首先執行 11 * method:被調用方法名字 12 * args:給method傳遞的參數 13 * target:被代理的目標對象 14 */ 15 @Override 16 public void before(Method method, Object[] args, Object target) 17 throws Throwable { 18 // TODO Auto-generated method stub 19 //method.getName()方法將得到目標函數的函數名稱 20 System.out.println("記錄日誌...." + method.getName()); 21 } 22 23 }
4.通過new/File新建一個bean.xml配置文件,開始配置前置通知
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xmlns:context="http://www.springframework.org/schema/context" 5 xsi:schemaLocation="http://www.springframework.org/schema/beans 6 http://www.springframework.org/schema/beans/spring-beans.xsd 7 http://www.springframework.org/schema/context 8 http://www.springframework.org/schema/context/spring-context.xsd"> 9 10 <!--4.1 配置一個被代理的對象即目標對象--> 11 <bean id="testService" class="com.LHB.aop.testService"> 12 <property name="name" value="張三" /> 13 </bean> 14 <!--4.2 配置前置通知 --> 15 <bean id="MyMethodBeforeAdvice" class="com.LHB.aop.MyMethodBeforeAdvice" /> 16 <!--4.3 配置代理對象 --> 17 <bean id="ProxyFactoryBean" class="org.springframework.aop.framework.ProxyFactoryBean"> 18 <!--4.3.1 配置代理接口集 --> 19 <property name="proxyInterfaces"> 20 <list> 21 <value>com.LHB.aop.TestServiceInterface</value> 22 <value>com.LHB.aop.TestServiceInterface2</value> 23 </list> 24 </property> 25 <!--4.3.2 把通知織入到代理對象 --> 26 <property name="interceptorNames"> 27 <!-- 相當於把MyMethodBeforeAdvice前置通知把代理對象關聯起來,也可以把通知看成攔截器 --> 28 <value>MyMethodBeforeAdvice</value> 29 </property> 30 <!--4.3.3 配置被代理對象可以指定 --> 31 <property name="target" ref="testService"/> 32 33 </bean> 34 35 </beans>
5. 創建一個測試類APP
1 package com.LHB.aop; 2 3 import org.springframework.context.ApplicationContext; 4 import org.springframework.context.support.ClassPathXmlApplicationContext; 5 6 public class App { 7 8 public static void main(String[] args) { 9 // TODO Auto-generated method stub 10 ApplicationContext ac = new ClassPathXmlApplicationContext("com/LHB/aop/beans.xml"); 11 TestServiceInterface tsi = (TestServiceInterface) ac.getBean("ProxyFactoryBean"); 12 tsi.sayHello(); 13 ((TestServiceInterface2)tsi).sayBye(); 14 15 } 16 17 }
6. 運行結果
aop編程之前置通知