1. 程式人生 > >aop編程之前置通知

aop編程之前置通知

his alt rate static 4.2 private oid www. out

aop( Aspect-Oriented Programming)前置通知原理案例講解

編程步驟;

  1. 定義接口
  2. 編寫對象(被代理的對象即目標對象)
  3. 編寫通知(前置通知即目標方法調用前調用)
  4. 在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     public
void 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         return
name; 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編程之前置通知