日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

spring的aop配置-配置将通知织入目标对象

發布時間:2024/4/13 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 spring的aop配置-配置将通知织入目标对象 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
咱們學習如何來進行配置,再新建一個包,d_springaop,然后配置文件需要單獨在aop中配置一份,在這里面咱們來看一下,如何進行配置,首先在配置之前要有一個準備工作,咱們要用到新的名稱空間了,又要導入新的約束了,咱們導入新的約束AOP約束,這里是不是有aop

導的方法就是以前介紹過的方法,這里改成Schema Location

這個文件使用右鍵xml edit打開,然后在desgin的beans這里edit namespace再打開,Add

然后添加剛剛咱們填進來的那個

然后prefix是空

package com.learn.service;public class UserServiceImpl implements UserService {@Overridepublic void save() {System.out.println("保存用戶!");}@Overridepublic void delete() {System.out.println("刪除用戶!");}@Overridepublic void update() {System.out.println("更新用戶!");}@Overridepublic void find() {System.out.println("查找用戶");}} package com.learn.d_springaop;import org.aspectj.lang.ProceedingJoinPoint;/*** 通知類* @author Leon.Sun**/ public class MyAdvice {/*** 前置通知* |-目標方法運行之前調用*//*** 后置通知(如果出現異常不會調用)* |-在目標方法運行之后調用*//*** 環繞通知* |-在目標方法之前和之后調用*//*** 異常攔截通知* |-如果出現異常,就會調用*//*** 后置通知(無論是否出現異常 都會調用)* |-在目標方法運行之后調用*/// --------------------------------------------------------------------/*** 前置通知*/public void before() {System.out.println("這是前置通知!!");}/*** 后置通知*/public void afterReturning() {System.out.println("這是后置通知!!(如果出現異常不會調用)");}/*** 環繞通知* @param pjp* @throws Throwable */public Object around(ProceedingJoinPoint pjp) throws Throwable {System.out.println("這是環繞通知之前的部分!!");/*** 調用目標方法*/Object proceed = pjp.proceed();System.out.println("這是環繞通知之后的部分!!");return proceed;}/*** 異常通知*/public void afterException() {System.out.println("出事啦!出現異常啦!");}/*** 后置通知*/public void after() {System.out.println("后置通知(無論是否出現異常 都會調用)");} } 導完以后保存一下,現在咱們已經保存完了,寫一下準備工作,導入咱們的aop命名空間,然后接下來再寫一個步驟,準備工作,導入咱們AOP的命名,然后接下里再寫一個步驟,步驟很簡單,第一步,首先配置目標對象,第二步配置咱們的通知,寫一個通知類,我把這個類移到這里來,這個包就不要了,然后呢,第三步,目標對象和通知都有了,配置將通知織入目標對象,第一個配置目標對象,就是用咱們昨天寫的,然后來一個name屬性,class文件,咱們目標對象已經指出來了,是不是這玩意,這是咱們的UserServiceImpl,這里還記得吧,然后給他起個名字,userServiceTarget,這個名字是為了讓你們明白啥意思,它會有個目標,這個單詞,然后再往下,配置通知對象,bean,name,class,通知對象配置的時候,跟上面的對象一樣配,你就把剛才寫的通知類,完整類名復制,粘到這里來,這里起個名字myAdvice,目標對象和通知對象就像普通對象配就行了,下面你怎么告訴他呢,這塊就要用到咱們的AOP,aop:config,首先要使用aop,還得來一個aop:pointcut,用這兩個元素來完成這個配置,aop:config這個根元素我就不說了,看名字就知道他是用來配置的,具體里面配置的是啥呢,第一個元素,這個名詞剛才學過,pointcut,cut是切,point是點,翻過來就是配置切點,配置切入點,還記得是啥意思不,哪些方法是我們確實要準備增強的,這個就是切入點,是這樣的,已經要增強和確定要增強的是一個意思,咱們四個方法,想對這三個方法要進行增強,我想把通知織入到這方法中去,那這三個方法是不是就是切點了,是不是這個意思,這個切入點的話,兩個屬性,id屬性給你配置的切點隨便取個名字,比如我們取名字叫pc,重點是這個expression,這是一個切點表達式,在咱們的Spring當中,切點使用表達式來表達的,execution,這是一個固定格式,首先execution,再寫一個括號,表達式看怎么寫,這個表達式是關鍵,看好啊,比如說,在對我只想對save方法,我只想對我的save方法進行增強,剛才我寫的通知,只想給save方法加強,其他方法我不管,知道啥意思不,你看我切點應該怎么寫,看我怎么寫的,拷貝完整路徑方法名,完整方法名,然后在這一粘,然后前面加上一個public,然后再加上一個void,這樣的話第一個切點表達式就寫完了,這個表達式表達啥意思呢,現在你這個通知,你這個切點是打算,為這個類,這個是完整類名,下面的save方法,然后這個save方法,這個括號里面什么也沒有,表示空,空參的save方法,并且這個save方法的修飾符必須是public,返回值必須是void,是不是這個意思,咱們一般配置切入點的時候都是這么寫,太羅嗦了,一般public是省略掉的,它默認值即使針對咱們的public方法,所以,一般來講,public你也不用寫,再往下演化,一點點的演化,其實這個方法的返回值,定義void太窄了,咱們這個返回值的話,一般切入點不對返回值作要求,就是你啥返回值的方法都給你切入,那就對應一個*號,對返回值不做任何要求,然后再往下演化,其實咱們這個方法其實不僅僅想對save方法進行切入,進行增強,你在這里可以使用一個星號來表示你要為UserServiceImpl下的所有方法,在這里結合起來你會發現,是不是為這個類下面的所有方法,其中返回值是任意的,但是還有一個問題,但是必須是空參方法,是不是這個意思,接下來再往下演化,*括號點點,這個點點啥意思呢,方法的參數不做任何要求,參數可以沒有,為空也可以,有多少個參數也沒問題,演化到這符合咱們開發的要求了嗎,還差點,你看我現在都是針對這個類名,沒錯,到這一步的話,那這個就接近最后的表達式形態了,基本上已經是了,再可能還有一個情況是什么呢,還有的情況的話,這里有兩點,兩點就是指,一個點是只找service下面的,service包下面的所有的,如果點點的話,他除了找service以他為結尾的節點,還會找他的子包,也就是這個包下面的,所有子包也會找,一般情況下,用不著,為啥呢,因為咱們放一般放的比較規矩,不會搞成亂七八糟的,那這兩種啊,這兩種加起來一般就是咱們的最終形態了,表達式能翻譯出來嗎,希望你們自己能夠翻譯出來,這是啥意思啊,是不是從這個包下,去找所有以ServiceImpl結尾的類,當中的所有方法,這個方法參數不做任何限制,任意參數,并且返回值,任意的方法,那這個表達式就拿他試試吧,把這個表達式粘到這個位置,這樣的話切點就定義好了,再到咱們的aspect里面來,切點有了以后,你就要描述通知了,通知的描述看一下,看到這些元素詳細你能看到啥意思,你看到這個元素之后,你知道剛才的方法名啥意思了,咱們前置通知的話,就可以使用aop:before,然后在這塊method,就填advice方法,意思就是咱們的before方法,作為咱們前置通知的方法,但是這里還有一個去指定,ref等于myAdvice,表示從myAdvice取得before方法,前置通知,指定名為before的方法作為前置通知,然后接下來的話,還有一個屬性叫做,pointcut-ref,把剛才的id pc填進來,那這樣寫起來的話,是不是把before作為前置通知,是不是切入到這個切入點當中,看明白啥意思了,這是不是完整了,咱們一共5種通知,AOP前置完了以后還有后置,after是after-returning,那具體的method咱們已經寫了,我也應該叫做afterReturning,然后呢,起點都是一樣的,還是用pc,aop再來一個around,咱們的method名叫做around,然后切點一樣的,切點還是指定為pc,然后aop下面應該是after-throwing,這是異常通知,咱們這里有afterException,然后同樣切點,都是應用同一個切點,然后最后一個,aop:after,然后這個method名字叫做,after,pointcut-ref粘過來,這樣的話5個通知配完了,這個是后置,異常攔截通知,然后這個叫做環繞通知,5個通知配置完以后,那這個配置有了以后,這段配置就是咱們的第四部分,如何進行配置,配置完以后咱們就可以來進行測試了 在這里面新建一個測試類,配置文件我們現在是不是要讀取這個配置文件,拷貝這個配置文件的路徑放到這里,去掉src之前的東西,然后咱們要測的是咱們的useServiceTarget,獲得userServiceTarget注入到UserService當中,因為咱們配置下面這個配置之后,他就會對咱們的UserService,根據切點,咱們的Target是不是符合這個切點表達式,這個切點表達式是不是指定了哪個方法需要對應用通知,咱們你看這個類名是否要符合,所以他就會對咱們的UserService,進行切入,這個我就不用Target,target反而誤會 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans" 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-4.2.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.2.xsd "><!-- 準備工作:導入(約束)aop的命名空間 --><!-- 1.配置目標對象 --><bean name="userService" class="com.learn.service.UserServiceImpl"></bean><!-- 2.配置通知對象 --><bean name="myAdvice" class="com.learn.d_springaop.MyAdvice"></bean><!-- 3.配置將通知織入目標對象 --><aop:config><!-- 配置切入點 public void com.learn.service.UserServiceImpl.save()void com.learn.service.UserServiceImpl.save()* com.learn.service.UserServiceImpl.save()* com.learn.service.UserServiceImpl.*()* com.learn.service.UserServiceImpl.*(..)* com.learn.service.*ServiceImpl.*(..)* com.learn.service..*ServiceImpl.*(..)--><aop:pointcut expression="execution(* com.learn.service.*ServiceImpl.*(..))" id="pc"/><aop:aspect ref="myAdvice"><!-- 指定名為before方法作為前置通知 --><aop:before method="before" pointcut-ref="pc" /><!-- 后置 --><aop:after-returning method="afterReturning" pointcut-ref="pc"/><!-- 環繞通知 --><aop:around method="around" pointcut-ref="pc"/><!-- 異常攔截通知 --><aop:after-throwing method="afterException" pointcut-ref="pc"/><!-- 后置 --><aop:after method="after" pointcut-ref="pc"/></aop:aspect></aop:config></beans> 那咱們就直接獲得UserService,已經對Service進行了一個代理了,獲得的直接是代理對象,接下來你調一下,us點save方法,執行一下,看一下效果 package com.learn.d_springaop;import javax.annotation.Resource;import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;import com.learn.service.UserService;@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration("classpath:com/learn/d_springaop/applicationContext.xml") public class Demo {/*** 將名為userServiceTarget的對象注入到us變量中*/@Resource(name="userService")private UserService us;@Testpublic void fun1() {us.save(); } } 這是前置通知!! 這是環繞通知之前的部分!! 保存用戶! 后置通知(無論是否出現異常 都會調用) 這是環繞通知之后的部分!! 這是后置通知!!(如果出現異常不會調用) 他是不是會在咱們容器當中,符合咱們切點的對象,是不是進行代理,這個切點是不是符合,所以對他進行一個代理,然后可以看看,咱們的通知啟不啟,這是不是環繞通知,環繞通知之前,環繞通知之后,這是不是后置通知,是不是兩個,咱們好像現在還差一個啥,是不是異常通知,異常通知要演示的話,怎么演示呢,你必須讓他出個異常,這塊的話咱們找到,這個方法在這里,保存方法,保存用戶之后,咱們來一個異常,int i = 1 /0;這是不是會出異常,然后再來執行一下 package com.learn.d_springaop;import org.aspectj.lang.ProceedingJoinPoint;/*** 通知類* @author Leon.Sun**/ public class MyAdvice {/*** 前置通知* |-目標方法運行之前調用*//*** 后置通知(如果出現異常不會調用)* |-在目標方法運行之后調用*//*** 環繞通知* |-在目標方法之前和之后調用*//*** 異常攔截通知* |-如果出現異常,就會調用*//*** 后置通知(無論是否出現異常 都會調用)* |-在目標方法運行之后調用*/// --------------------------------------------------------------------/*** 前置通知*/public void before() {System.out.println("這是前置通知!!");}/*** 后置通知*/public void afterReturning() {System.out.println("這是后置通知!!(如果出現異常不會調用)");}/*** 環繞通知* @param pjp* @throws Throwable */public Object around(ProceedingJoinPoint pjp) throws Throwable {System.out.println("這是環繞通知之前的部分!!");/*** 調用目標方法*/Object proceed = pjp.proceed();System.out.println("這是環繞通知之后的部分!!");return proceed;}/*** 異常通知*/public void afterException() {System.out.println("出事啦!出現異常啦!");int i = 1/0;}/*** 后置通知*/public void after() {System.out.println("后置通知(無論是否出現異常 都會調用)");} } 執行報錯會出這個異常 這是前置通知!! 這是環繞通知之前的部分!! 保存用戶! 后置通知(無論是否出現異常 都會調用) 這是環繞通知之后的部分!! 這是后置通知!!(如果出現異常不會調用)

?

總結

以上是生活随笔為你收集整理的spring的aop配置-配置将通知织入目标对象的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。