1. 程式人生 > >Spring之註解實現aop(面向切面程式設計)

Spring之註解實現aop(面向切面程式設計)

1:Aop(aspect object programming)面向切面程式設計,名詞解釋:
    1.1:功能:讓關注點程式碼與業務邏輯程式碼分離
    1.2:關注點
        重複程式碼就叫做關注點
    1.3:切面
        關注點形成的類,就叫做切面(類)
        面向切面程式設計,就是指對很多功能都有的重複程式碼抽取,再在執行的時候往業務方法上動態植入"切面類程式碼";
    1.4:切入點
        執行目標物件方法,動態植入切面程式碼
        可以通過切入點表示式,指定攔截那些類的那些方法,給指定的類在執行的時候植入切面類程式碼;
2:註解方式實現aop程式設計
    2.1:開發步驟


 (1):先引入aop相關的jar檔案
            spring-aop-3.2.5.RELEASE.jar【去spring3.2原始碼裡面找】
            aopalliance.jar【去spring2.5原始碼/lib/aopalliance檔案裡面找】
            aspectjweaver.jar【去spring2.5原始碼/lib/aspectj檔案裡面找】或者【aspectj-1.8.2/lib/aspectjweaver.jar】
            aspectjrt.jar【去spring2.5原始碼/lib/aspectj檔案裡面找】或者【aspectj-1.8.2/lib/aspectjrt.jar】

        《注意:用到的spring2.5版本的jar本艦,如果用jd1.7版本可能會出現問題,
              需要升級以下aspectj元件,即使用aspectj-1.8.2版本中提供的jar檔案aspectjweaver.jar和aspectjrt.jar》    


(2)bean.xml中引入aop名稱空間
      技巧:找到檔案spring-framework-3.2.5.RELEASE/docs/spring-framework-reference/htmlsingle
         開啟index.html搜尋xmlns:aop然後找到下面紅色三句話,分別拷貝到bean.xml中
         <?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.xsd">

      拷貝之後的bean.xml如下所示:

  <?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:p="http://www.springframework.org/schema/p"
      xmlns:context="http://www.springframework.org/schema/context"
      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/context
          http://www.springframework.org/schema/context/spring-context.xsd
          http://www.springframework.org/schema/aop
          http://www.springframework.org/schema/aop/spring-aop.xsd">
 
 </beans> 

 

(3):bean.xml中開啟aop註解掃描,如下配置所示:

  <?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:p="http://www.springframework.org/schema/p"
     xmlns:context="http://www.springframework.org/schema/context"
     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/context
        http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop.xsd">
 
       <!-- 開啟註解掃描 -->
       <context:component-scan base-package="com.bie.aop"></context:component-scan>   
         
       <!-- 開啟aop註解方式,預設為false -->    
       <aop:aspectj-autoproxy></aop:aspectj-autoproxy>
       
 </beans>        

 

(4):開始寫一個切面類,原始碼如下所示:

  package com.bie.aop;
  
  import org.aspectj.lang.annotation.After;
  import org.aspectj.lang.annotation.Aspect;
  import org.aspectj.lang.annotation.Before;
  import org.aspectj.lang.annotation.Pointcut;
  import org.springframework.stereotype.Component;
  
  
 /** 
 * @author BieHongLi 
 * @version 建立時間:2017年3月28日 下午9:10:43 
 * @Aspect:指定當前類為切面類
 */
 @Component  //加入到IoC容器
 @Aspect  //指定當前類為切面類
 public class Aop {
 
     //指定切入點表示式,攔截那些方法,即為那些類生成代理物件
     //@Pointcut("execution(* com.bie.aop.UserDao.save(..))")  ..代表所有引數
    //@Pointcut("execution(* com.bie.aop.UserDao.*())")  指定所有的方法     //@Pointcut("execution(* com.bie.aop.UserDao.save())") 指定save方法
    
     @Pointcut("execution(* com.bie.aop.UserDao.*(..))")
    public void pointCut(){
        
     }
     
     @Before("pointCut()")
     public void begin(){
         System.out.println("開啟事務");
     }
     
     @After("pointCut()")
     public void close(){
         System.out.println("關閉事務");
     }
     
 }