17 spring學習 AOP初步實現

2021-09-07 16:18:50 字數 3960 閱讀 9298

aop是面向方面的程式設計,在實際開發中,aop都會工作在業務層,因為業務層要呼叫資料層,而業務層也要完成所有輔助性的業務層操作。

package

com.spring.service;

import

com.spring.vo.member;

public

inte***ce

imemberservice

package

com.spring.service.impl;

import

org.springframework.stereotype.service;

import

com.spring.service.imemberservice;

import

com.spring.vo.member;

@service

public

class imemberserviceimpl implements

imemberservice

}

此時的業務層只關興核心的業務功能,核心的功能就是呼叫了業務層**。

隨後所有的輔助性操作功能,都通過spring容器,動態配置。

base-package:表示掃瞄com.spring開頭的包以下的檔案,配合@service註解,這個包以下的相關類會自動配置,代替一般的bean配置。

可以複習:

測試**:

package

com.spring.test;

import

import

import

com.spring.service.imemberservice;

import

com.spring.service.impl.memberserviceimpl;

import

com.spring.vo.member;

public

class

testmemberservice

}

輸出結果:

但是這種操作並不嚴格,還需要準備相應的輔助性功能,那麼這些輔助性的功能,可以單獨定義在乙個切面處理的類之中。

這裡的切面類也用@

package

com.spring.aop;

import

org.springframework.stereotype.component;

@component

public

class

serviceaspect

public

void

serviceafter()

}

預設情況下spring不會開啟切面。引入aop命名空間。

勾選上:

**中多了這些:

下面在xml檔案中配置檔案組織切面。

重新執行最開始的test類,發現報錯:

bean named 'memberserviceimpl' must be of type [com.spring.service.impl.memberserviceimpl], but was actually of type [com.sun.proxy.$proxy8]
網上查詢得知:

使用了jdk的自動動態**,需要在

執行後結果:

此時的業務層裡面還沒有出現任何的與業務層的核心操作有關的**。而所有的輔助功能都會以切面的形式出現在專案的執行過程之中,而

這些切面就是最早的**類

步驟:1,首先需要定義乙個切面aop:pointcut ,裡面包含這個切面所覆蓋的位置,由表示式expression決定,然後還需要乙個id值。

2,然後定義乙個面向方面的處理類;aop:aspect,裡面需要指定這個類的例項是哪個,上面用ref和annotation配置組合確定了。

3,分別指定由aop:aspect指定的處理類的aop:before,aop,after等方法,裡面需要指定這個方法關聯哪個切面,通過pointcut-ref指定切面,然後就會對該切面所

覆蓋指定的類的物件,進行切面處理了,比如每次相關類例項物件呼叫方法的時候,aop:befer等方法也會被呼叫。

分析結果:

這裡切面和我們的service類關聯起來的地方就是定義切面處的 expression="execution(* com.spring..*.*(..)))" 。

只要符合這個表示式的類,這裡就是這個包下面的類,的物件例項執行,在執行前和執行後都會呼叫切面類裡面的方法,具體呼叫哪個方法

,有aop:before,或者aop:*** 絕對。

整個配置過程中,其基本的操作意義基本一看明白,但是最重要的是切入點的設定。

execution(* com.spring..*.*(..)))
這種語法就是aspectj定義的切入點操作語法。此語法結構如下:

excution(修飾符匹配? 返回值型別  操作型別的匹配?  名稱匹配(引數匹配) 丟擲異常匹配)

這裡的?表示乙個或0個。

以上語法詳細解釋如下:

1,修飾符:public  private ,只能出現0次或1次,(本次沒有出現,預設public)

2,返回值:execution(*com.spring..*.*(..)))。如果使用的是*,表示返回任意型別。

3,名稱匹配:execution(*com.spring..*.*(..))),表示的是具體要使用的此切面的程式類,如果寫的是com.spring表示這個包中的,

而如果出現「..」,則表示在任意子包下,隨後的*.*表示任意類的任意方法,第乙個*表示類名稱,第二個表示方法名稱

4,方法引數:execution(* com.spring..*.*(..))),使用「..」表示使用任意多個引數,如果使用的是「*」,表示匹配任意乙個引數。

比如execution(* com.spring..*.*(..)))就表示:在com.spring這個包下,任意返回值的任意類的,任意方法中,任意引數的地方,都要執行這個切面的攔截。

一旦攔截成功,就觸發相應的處理方法,讓我們的切面執行

Spring學習日記(一)AOP的初步實現

工具 myeclipse 1 新建乙個web project 2 匯入spring開發包 專案檔案 右鍵 configure facets install spring facets 3 配置annotaion 4 配置aop 開啟aop命名空間 1 定義業務層操作介面 定義業務層介面 public...

spring學習初步

package cn.bupt.duming.service public inte ce greetingservice 儘管看起來,在此處沒必要隱藏介面,但是我們還是建議將實現與介面分離。public class greetingserviceimpl implements greetingse...

黃曉童SPRING學習筆記 對AOP的初步理解

spring的定義 對di的初步理解 對aop的初步理解 對di的深入 對aop的深入 spring的事務管理 spring mvc 接下來闡述一下我對aop的理解,還是回到之前那個騎士和尋找聖杯的場景來。現在場景稍有改變,在騎士尋找聖杯的時候,要有乙個詩人陪伴他,以朗誦詩歌的形式為他 按照以往的方...