1. 程式人生 > >Spring 學習筆記(八)AOP 之XML方式

Spring 學習筆記(八)AOP 之XML方式

術語先來一發

  • 目標物件(Target)
  • 代理物件(Proxy)
  • 連線點(Joinpoint)
  • 切入點(Pointcut)
  • 通知(增強)(Advice)
  • 切面(Aspect、Advisor)
  • 織入、切入(weaving)

第一步,建立目標類和切面類, 這倆類就是普通類, 包含各自的方法,沒有涉及到註解配置啥的

第二步,在applicationContext.xml中新增相關配置

<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:aop="http://www.springframework.org/schema/aop"
       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
       http://www.springframework.org/schema/aop
       http://www.springframework.org/schema/aop/spring-aop.xsd">

    <!--注意名稱空間和約束-->
    <!--1. 建立目標物件-->
    <bean id="sadamu" class="org.spring.exampleAOP.Sadamu" />

    <!--2. 建立代理物件-->
    <bean id="myAspect1" class="org.spring.exampleAOP.MyAspect1"/>
    <!--3. 配置AOP切面-->
    <aop:config>
        <!--切面 = 通知 + 切入點 -->
        <aop:aspect ref="myAspect1">
            <!--如果報錯,首先檢查 execution這個英文單詞寫沒寫對!!!-->
            <aop:pointcut expression="execution( * org.spring.exampleAOP.Sadamu.*(..))" id="pt"/>
            <aop:before method="log" pointcut-ref="pt"/>
        </aop:aspect>
    </aop:config>
</beans>

第三步,測試 

package org.spring.exampleAOP;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;

public class Test {
    public static void main(String[] args) { 

        ApplicationContext applicationContext1 = new FileSystemXmlApplicationContext("./src/applicationContext.xml");
        //獲取Bean物件
        People people1 = (People) applicationContext1.getBean("sadamu");
        people1.Shoot();

    }
}

結果: 

記錄日誌
薩達姆開槍了

Process finished with exit code 0

ps: 如果報錯,首先檢查 execution這個英文單詞寫沒寫對.

關於切入點表示式execution(這一段)

  1. 匹配所有就寫*號,如果訪問型別修飾符和返回值都不限制的話就寫一個*號就行了;
  2. 引數,..代表匹配所有;
  3. 一個*代表匹配只有一個引數的方法並不限制類型;
  4. (*,String) 代表匹配第一個引數不限制,第二個引數是String型別的所有方法

通知型別

         前置通知:在方法執行前觸發

         最終通知:在方法執行後觸發,無論方法是否丟擲異常

         後置通知:在方法執行後觸發,方法出現異常就不執行了

         異常通知:在方法出現異常後觸發

         環繞通知:在方法執行前和執行後觸發