? Spring AOP的方式主要有兩種:一種是通過xml文件的方式颠区,第二種是通過注解的方式。
通過xml文件
? 首先澡腾,編寫相應(yīng)的切面代碼
? 其次編寫相應(yīng)的xml文件
? 先在配置文件上給剛剛的日志類在配置文件上聲明相應(yīng)的bean才顿,然后再進(jìn)行相應(yīng)的aop的定義蒋伦。要確定一個(gè)切面沃斤,只需要確定該切面在什么時(shí)候(<aop:pointcut>)利用哪個(gè)類中(<aop:aspect ref="...">)的什么方法(aop:before/after/after-returning/after-throwing/around)圣蝎。需要aop發(fā)揮作用刃宵,還需要在xml配置文件中添加代理:<aop:aspectj-autoproxy/>和在頭部添加相應(yīng)的命名空間
? ?編寫相應(yīng)的測試程序可以看到如下結(jié)果:
? 可以看到在運(yùn)行g(shù)etName()方法前衡瓶,會(huì)先運(yùn)行我們定義的切面函數(shù),在getName()方法運(yùn)行后牲证,也會(huì)運(yùn)行相應(yīng)的切面函數(shù)哮针,可是我們并不需要在核心業(yè)務(wù)的代碼上添加相應(yīng)的方法,只需要定義好切面,系統(tǒng)將會(huì)為我們在恰當(dāng)?shù)臅r(shí)間點(diǎn)做相應(yīng)的事情十厢。
通知函數(shù)
? <aop:before/after...>等標(biāo)簽定義的是通知函數(shù)等太,通知函數(shù)就是在切點(diǎn)觸發(fā)時(shí)所運(yùn)行的方法,而運(yùn)行的時(shí)間點(diǎn)有5種:before, after, after-returning, after-throwing, around蛮放。
? 這五個(gè)時(shí)間點(diǎn)具體意義如下:
表達(dá)式
? 定義切面的切入點(diǎn)(pointcut)主要是通過表達(dá)式來進(jìn)行定義
? 上述的表達(dá)式定義的切點(diǎn)是在edu.stu.pojo.Student類里面的任意方法缩抡。而這種表達(dá)式主要是通過切入點(diǎn)指示符來進(jìn)行描述,切入點(diǎn)指示符主要有:within(<type name>)根據(jù)類名來進(jìn)行過濾包颁,execution(<scope> <return-type> <fully-qualified-class-name>.*(parameters))根據(jù)方法進(jìn)行過濾瞻想,還有一些其他的表達(dá)式,這里就不列出娩嚼。還有一些輔助使用的通配符:..(用在方法中指任意數(shù)量的參數(shù)蘑险,用在包中指任意數(shù)量的包),+(代表任意子類)岳悟,*(代表任意字符)佃迄。
利用@Aspect注解
? 利用@Aspect注解來標(biāo)識(shí)切面函數(shù),其實(shí)和用注解標(biāo)記pojo類一樣贵少,我們不需要在配置文件中再寫類似于上述的<aop>標(biāo)簽呵俏,而只是通過一些注解來完成配置文件的描述那樣,下面是通過@Aspect注解定義的一個(gè)類滔灶。
? @Aspect
注解柴信,相當(dāng)于在xml文件中定義一個(gè)切面,通常@Aspect注解是對類來進(jìn)行標(biāo)識(shí)宽气;
@Pointcut注解就是用來定義切點(diǎn)随常,這個(gè)注解就相當(dāng)于在xml文件上編寫<aop:pointcut>標(biāo)簽,其中注解內(nèi)的屬性就是定義的表達(dá)式萄涯,而函數(shù)名(selectAll())就是該切點(diǎn)的名字绪氛。然后通過后面的@Before, @After等通知函數(shù)標(biāo)簽來標(biāo)識(shí)通知函數(shù)。同樣涝影,也可以直接在通知函數(shù)標(biāo)簽里定義表達(dá)式枣察,來免除@Pointcut的注解
感想
? 通過Spring AOP的技術(shù),可以讓我們的代碼更為集中于我們的核心業(yè)務(wù)燃逻,可以將與其關(guān)系不大的代碼提取出來序目,并且在適當(dāng)?shù)臅r(shí)候動(dòng)態(tài)織入〔螅可是由于本人對Spring框架初學(xué)猿涨,在運(yùn)用方面較少,所以還未感受到Spring AOP更大的好處姆怪,或者在項(xiàng)目運(yùn)用上還沒有較好地實(shí)踐叛赚。