spring之AOP操作(基於aspectJ實現)--配置文件和注解兩種方式實現


AOP概念

  1 aop:面向切面(方面)編程,擴展功能不修改源代碼實現

 

  2  AOP采取橫向抽取機制,取代了傳統縱向繼承體系重復性代碼

 

  3 aop底層使用動態代理實現

    (1)第一種情況,有接口情況,使用動態代理創建接口實現類代理對象

    (2)第二種情況,沒有接口情況,使用動態代理創建類的子類代理對象

 

AOP原理

  畫圖分析原理

 

      原始實現(基於縱向抽取):

      aop實現(橫向抽取):

AOP操作術語

  Joinpoint(連接點): 類里面可以被增強的方法,這些方法稱為連接點

 

  Pointcut(切入點):所謂切入點是指我們要對哪些Joinpoint進行攔截的定義.

 

  Advice(通知/增強):所謂通知是指攔截到Joinpoint之后所要做的事情就是通知.通知分為前置通知,后置通知,異常通知,最終通知,環繞通知(切面要完成的功能)

 

  Aspect(切面): 是切入點和通知(引介)的結合

 

  Introduction(引介):引介是一種特殊的通知在不修改類代碼的前提下, Introduction可以在運行期為類動態地添加一些方法或Field.

  Target(目標對象):代理的目標對象(要增強的類)

  Weaving(織入):是把增強應用到目標的過程.

            把advice 應用到 target的過程

  Proxy(代理):一個類被AOP織入增強后,就產生一個結果代理類

Spring的aop操作

    1 在spring里面進行aop操作,使用aspectj實現

    (1)aspectj不是spring一部分,和spring一起使用進行aop操作

    (2)Spring2.0以后新增了對AspectJ支持

 

    2 使用aspectj實現aop有兩種方式

    (1)基於aspectj的xml配置

    (2)基於aspectj的注解方式

  Aop操作准備

    1 除了導入基本的jar包之外,還需要導入aop相關的jar包

      

    2 創建spring核心配置文件,導入aop的約束

 

  使用表達式配置切入點

    1 切入點:實際增強的方法

 

    2 常用的表達式

      execution(<訪問修飾符>?<返回類型><方法名>(<參數>)<異常>)

      (1)execution(* cn.itcast.aop.Book.add(..))

      (2)execution(* cn.itcast.aop.Book.*(..))

      (3)execution(* *.*(..))

      (4) 匹配所有save開頭的方法 execution(* save*(..))

 

  Aspectj的aop操作(使用配置文件實現)

<!-- 1  配置對象 -->
    <bean id="book" class="cn.itcast.aop.Book"></bean>
    <bean id="myBook" class="cn.itcast.aop.MyBook"></bean>
    
    <!-- 2 配置aop操作 -->
    <aop:config>
        <!-- 2.1 配置切入點 -->
        <aop:pointcut expression="execution(* cn.itcast.aop.Book.*(..))" id="pointcut1"/>
        
        <!-- 2.2 配置切面 
            把增強用到方法上面
        -->
        <aop:aspect ref="myBook">
            <!-- 配置增強類型 
                method: 增強類里面使用哪個方法作為前置
            -->
            <aop:before method="before1" pointcut-ref="pointcut1"/>
            
            <aop:after-returning method="after1" pointcut-ref="pointcut1"/>
            
            <aop:around method="around1" pointcut-ref="pointcut1"/>
        </aop:aspect>
    </aop:config>
public class MyBook {

    public void before1() {
        System.out.println("前置增強......");
    }
    
    public void after1() {
        System.out.println("后置增強......");
    }
    
    //環繞通知
    public void around1(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
        //方法之前
        System.out.println("方法之前.....");
        
        //執行被增強的方法
        proceedingJoinPoint.proceed();
        
        //方法之后
        System.out.println("方法之后.....");
    }
}

 

  基於aspectj的注解實現

    1 使用注解方式實現aop操作

      第一步 創建對象

      第二步 在spring核心配置文件中,開啟aop操作

<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">
    
    <!-- 開啟aop操作 -->
    <aop:aspectj-autoproxy></aop:aspectj-autoproxy>
    
    <!-- 1  配置對象 -->
    <bean id="book" class="cn.itcast.aop.Book"></bean>
    <bean id="myBook" class="cn.itcast.aop.MyBook"></bean>
    
</beans>

      第三步 在增強類上面使用注解完成aop操作

@Aspect
public class MyBook {

    //在方法上面使用注解完成增強配置
    @Before(value="execution(* cn.itcast.aop.Book.*(..))")
    public void before1() {
        System.out.println("before..............");
    }
}

 


免責聲明!

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



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