spring中的aop的xml配置方式簡單實例


  aop,即面向切面編程,面向切面編程的目標就是分離關注點,比如:一個騎士只需要關注守護安全,或者遠征,而騎士輝煌一生的事跡由誰來記錄和歌頌呢,當然不會是自己了,這個完全可以由詩人去歌頌,比如當騎士出征的時候詩人可以去歡送,當騎士英勇犧牲的時候,詩人可以寫詩歌頌騎士的一生。那么騎士只需要關注怎么打仗就好了。而詩人也只需要關注寫詩歌頌和歡送就好了,那么這樣就把功能分離了。所以可以把詩人當成一個切面,當騎士出征的前后詩人分別負責歡送和寫詩歌頌(記錄)。而且,這個切面可以對多個騎士或者明人使用,並不只局限於一個騎士。這樣,既分離了關注點,也減低了代碼的復雜程度。代碼示例如下:

騎士類:

 1 package com.cjh.aop2;
 2 
 3 /**
 4  * @author Caijh
 5  *
 6  * 2017年7月11日 下午3:53:19
 7  */
 8 public class BraveKnight {
 9     public void saying(){
10         System.out.println("我是騎士");
11     }
12 }

詩人類:

 1 package com.cjh.aop2;
 2 
 3 /**
 4  * @author Caijh
 5  *
 6  * 2017年7月11日 下午3:47:04
 7  */
 8 public class Minstrel {
 9     public void beforSay(){
10         System.out.println("前置通知");
11     }
12     
13     public void afterSay(){
14         System.out.println("后置通知");
15     }
16 }

spring配置文件:

 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:aop="http://www.springframework.org/schema/aop"
 5     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
 6         http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd">
 7     <!-- 目標對象 -->
 8     <bean id="knight" class="com.cjh.aop2.BraveKnight"/>
 9     <!-- 切面bean -->
10     <bean id="mistrel" class="com.cjh.aop2.Minstrel"/>
11     <!-- 面向切面編程 -->
12     <aop:config>
13         <aop:aspect ref="mistrel">
14             <!-- 定義切點 -->
15             <aop:pointcut expression="execution(* *.saying(..))" id="embark"/>
16             <!-- 聲明前置通知 (在切點方法被執行前調用)-->
17             <aop:before method="beforSay" pointcut-ref="embark"/>
18             <!-- 聲明后置通知 (在切點方法被執行后調用)-->
19             <aop:after method="afterSay" pointcut-ref="embark"/>
20         </aop:aspect>
21     </aop:config>
22 </beans>

測試代碼:

 1 package com.cjh.aop2;
 2 
 3 import org.springframework.context.ApplicationContext;
 4 import org.springframework.context.support.ClassPathXmlApplicationContext;
 5 
 6 /**
 7  * @author Caijh
 8  *
 9  * 2017年7月11日 下午4:02:04
10  */
11 public class Test {
12     public static void main(String[] args) {
13         ApplicationContext ac = new ClassPathXmlApplicationContext("com/cjh/aop2/beans.xml");
14         BraveKnight br = (BraveKnight) ac.getBean("knight");
15         br.saying();
16     }
17 }

執行結果如下:

前置通知
我是騎士
后置通知

=======================================================================================

 aop(面向切面編程)的好處就是,當執行了我們主要關注的行為(騎士類對象),也就是切點,那么切面(詩人對象)就會自動為我們進行服務,無需過多關注。如上測試代碼,我們只調用了BraveKnight類的saying()方法,它就自己在saying方法前執行了前置通知方法,在執行完saying之后就自動執行后置通知。通過這樣我們可以做權限設置和日志處理。

 

補充:pointcut執行方法書寫格式如下

工程目錄結構:

 如果運行過程中出現nofoundclass的錯誤,一般是少了:aspectjweaver.jar這個包,需要下載,並添加進去雲盤提供:鏈接:http://pan.baidu.com/s/1mhGsZI4 密碼:y7wt

 

  

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM