1. 程式人生 > >Spring的通知和切入表示式的寫法

Spring的通知和切入表示式的寫法

1 Spring的通知型別 

1.1前置通知:在目標方法執行之前進行操作(aop:before)

  • 前置通知:獲得切入點資訊

1.2後置通知:在目標方法執行之後進行操作(aop:after-returning)

  • 配置(返回後的引數要與WRITELOG的引數名相同)
<aop:config>
	    <!-- 表示式配置哪些型別的方法需要增強 -->	    
	    <aop:pointcut expression="execution(* com.itykd.dao.impl.UserDaoImpl.delete(..))" id="pointCut2" returning="result"/>	    
	    <!-- 配置切面 -->
	    <aop:aspect ref="myAspect">	    
	        <aop:after-returning method="writeLog" pointcut-ref="pointCut2"/>	    
	    </aop:aspect>	
</aop:config>
  • WRITELOG方法需要提供一個Ojbect型別的引數,並且名字與配置檔案中的恢復中的相同 
	public void writeLog(Object result) {
		System.out.println("寫日誌...."+result);
	}
  •  刪除方法(這時WRITELOG中的結果引數將變成“永康達”)
	public String delete() {
		System.out.println("UserDaoImpl的delete方法執行了.....");
		return "ykd";
		
	}

1.3環繞通知:在目標方法執行之前和之後進行操作(aop:around)

  • 通知環繞可以阻止目標方法的執行
  • MyAspectXML類中新增的環繞方法:(1)返回型別必須是物件 ;(2)joinPoint.proceed()方法相當於執行目標程式 ;
  • 配置
<aop:config>
	    <!-- 表示式配置哪些型別的方法需要增強 -->    
	    <aop:pointcut expression="execution(* com.itykd.dao.impl.UserDaoImpl.update(..))" id="pointcut3" />	    
	    <!-- 配置切面 -->
	    <aop:aspect ref="myAspect">
	        <aop:around method="surround" pointcut-ref="pointcut3"/>	    
	    </aop:aspect>	
	</aop:config>
  •  圍繞方法(返回型別必須是物件)
	public Object surround(ProceedingJoinPoint joinPoint) throws Throwable {
		System.out.println("環繞前通知........");
		Object obj = joinPoint.proceed();
		System.out.println("環繞後通知........");
		return obj;
	}

1.4異常丟擲通知:在程式出現異常的時候進行的操作,比如事務的操作(aop:after-throwing)

  •  配置
	<aop:config>
	    <!-- 表示式配置哪些型別的方法需要增強 -->  
	    <aop:pointcut expression="execution(* com.itykd.dao.impl.UserDaoImpl.find(..))" id="pointcut4" />	    
	    <!-- 配置切面 -->
	    <aop:aspect ref="myAspect">    
	        <aop:after-throwing method="afterThrowing" pointcut-ref="pointcut4" throwing="ex"/>	    
	    </aop:aspect>	
  •  afterThrowinig方法,必須要有一個的Throwable的引數,上述配置檔案中投擲=“EX”要與Throwable的的引數前要相同
	public void afterThrowing(Throwable ex) {
		System.out.println("異常丟擲通知....."+ex);
	}

1.5最終通知:無論程式碼是否有異常,總會執行,這就類似於finally塊(aop:after)

	<aop:config>
	    <!-- 表示式配置哪些型別的方法需要增強 -->  
	    <aop:pointcut expression="execution(* com.itykd.dao.impl.UserDaoImpl.find(..))" id="pointcut5" />	    
	    <!-- 配置切面 -->
	    <aop:aspect ref="myAspect">    
	        <aop:after method="finalMethod" pointcut-ref="pointcut5" />	    
	    </aop:aspect>	

1.6 引介通知 

2  Spring切入點表示式寫法

  • 基於execution的函式完成的
  • 語法
  1. [訪問修飾符] 方法返回值 包名.類名.方法名(引數) []代表的是可選,注意有的之間是有空格的,是不能省略的:public void com.itykd.spring.CustomerDao.save(..)
  2. * *.*.*.*Dao.save(..) *代表的是萬用字元,但是方法引數中萬用字元使用..,而不是*
  3. * com.itykd.spring.CustomerDao+.save(..) “+”代表的是CustomerDao以及它的子類
  4. * com.itykd.spring..*.*(..) “..”代表的是spring以及它的子包