2021-05-12 14:32:11
Spring中的AOP的xml設定方式簡單範例
aop,即面向切面程式設計,面向切面程式設計的目標就是分離關注點,比如:一個騎士只需要關注守護安全,或者遠征,而騎士輝煌一生的事蹟由誰來記錄和歌頌呢,當然不會是自己了,這個完全可以由詩人去歌頌,比如當騎士出征的時候詩人可以去歡送,當騎士英勇犧牲的時候,詩人可以寫詩歌頌騎士的一生。那麼騎士只需要關注怎麼打仗就好了。而詩人也只需要關注寫詩歌頌和歡送就好了,那麼這樣就把功能分離了。所以可以把詩人當成一個切面,當騎士出征的前後詩人分別負責歡送和寫詩歌頌(記錄)。而且,這個切面可以對多個騎士或者明人使用,並不只侷限於一個騎士。這樣,既分離了關注點,也減低了程式碼的複雜程度。程式碼範例如下:
騎士類:
package com.linuxidc.aop2;
/**
* @author Caijh
*
* 2017年7月11日 下午3:53:19
*/
public class BraveKnight {
public void saying(){
System.out.println("我是騎士");
}
}
詩人類:
package com.linuxidc.aop2;
/**
* @author Caijh
*
* 2017年7月11日 下午3:47:04
*/
public class Minstrel {
public void beforSay(){
System.out.println("前置通知");
}
public void afterSay(){
System.out.println("後置通知");
}
}
spring組態檔:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
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-4.3.xsd">
<!-- 目標物件 -->
<bean id="knight" class="com.linuxidc.aop2.BraveKnight"/>
<!-- 切面bean -->
<bean id="mistrel" class="com.linuxidc.aop2.Minstrel"/>
<!-- 面向切面程式設計 -->
<aop:config>
<aop:aspect ref="mistrel">
<!-- 定義切點 -->
<aop:pointcut expression="execution(* *.saying(..))" id="embark"/>
<!-- 宣告前置通知 (在切點方法被執行前呼叫)-->
<aop:before method="beforSay" pointcut-ref="embark"/>
<!-- 宣告後置通知 (在切點方法被執行後呼叫)-->
<aop:after method="afterSay" pointcut-ref="embark"/>
</aop:aspect>
</aop:config>
</beans>
測試程式碼:
package com.linuxidc.aop2;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
* @author Caijh
*
* 2017年7月11日 下午4:02:04
*/
public class Test {
public static void main(String[] args) {
ApplicationContext ac = new ClassPathXmlApplicationContext("com/linuxidc/aop2/beans.xml");
BraveKnight br = (BraveKnight) ac.getBean("knight");
br.saying();
}
}
執行結果如下:
前置通知
我是騎士
後置通知
=======================================================================================
aop(面向切面程式設計)的好處就是,當執行了我們主要關注的行為(騎士類物件),也就是切點,那麼切面(詩人物件)就會自動為我們進行服務,無需過多關注。如上測試程式碼,我們只呼叫了BraveKnight類的saying()方法,它就自己在saying方法前執行了前置通知方法,在執行完saying之後就自動執行後置通知。通過這樣我們可以做許可權設定和紀錄檔處理。
補充:pointcut執行方法書寫格式如下
工程目錄結構:
如果執行過程中出現nofoundclass的錯誤,一般是少了:aspectjweaver.jar這個包,需要下載,並新增進去,可以到Linux公社資源站下載:
------------------------------------------分割線------------------------------------------
免費下載地址在 http://linux.linuxidc.com/
使用者名稱與密碼都是www.linuxidc.com
具體下載目錄在 /2017年資料/10月/19日/Spring中的AOP的xml設定方式簡單範例/
下載方法見 http://www.linuxidc.com/Linux/2013-07/87684.htm
------------------------------------------分割線------------------------------------------
本文永久更新連結地址:http://www.linuxidc.com/Linux/2017-10/147815.htm
相關文章