1. 程式人生 > >Spring aop(4)---aspectj

Spring aop(4)---aspectj

今天講一下Spring aop中的AspectJ:

一、AspectJ簡介

AspectJ是一個面向切面的框架,它擴充套件了Java語言。AspectJ定義了AOP語法,所以它有一個專門的編譯器

用來生成遵守Java字節編碼規範的Class檔案。

二、優勢:

aspectj技術主要是改進之前定位切點時不夠精確的問題,如aspectj可以使用切點語言定義切點更具體的特徵如方法的返回型別、

方法的形參等

三、使用

aspectj定義切點時採用的是切點語言,助理解:

△設定切點: cut.setExpression("execution( 用切點語言寫的切點表示式  )");

△用切點語言寫的切點表示式---相關知識點如下:

1) 切點表示式格式:  返回型別   包名.[子包名.]類名.方法名(引數型別列表)

2) "."是包名之間  或   包名與類名  或   類名與方法名  之間的

間隔符

3) ".."在包路徑位置代表任意深的目錄,在引數型別列表位置代表任意個數與型別的引數

4) "*"是作業系統中的通匹符

關鍵程式碼段:

	        //※※※※※※和之前的第一種切點技術相比有變化的就是這一點(使用購買來的aspectj)
		//宣告AspectJ的切點
		AspectJExpressionPointcut cut = new AspectJExpressionPointcut();
		//採用切點語言的表示式---指定切點
		cut.setExpression("execution( * cn.hncu..*son.*(..) )"); //
              
                //通知
		Advice advice = new MethodInterceptor() {
			@Override
			public Object invoke(MethodInvocation invocation) throws Throwable {
				System.out.println("前面攔攔....");
				Object reutnValue = invocation.proceed();//放行
				System.out.println("後面攔攔....");
				return reutnValue;
			}
		};
		
		//切面=切點+通知
		Advisor advisor = new DefaultPointcutAdvisor(cut, advice);
		
		//代理工廠
		ProxyFactoryBean factory = new ProxyFactoryBean();
		factory.setTarget(p);
		factory.addAdvisor(advisor);

採用切點語言定義切點表示式

  1.  攔截指定包路徑中Person類中的void返回型別的空參run方法                                                                                      cut.setExpression("execution(void cn.hncu.aop.aspectj.Person.run()  )");
  2. 攔截指定包路徑中Person類中的void返回型別的空參"任意"方法                                                             cut.setExpression("execution(void cn.hncu.aop.aspectj.Person.*()  )");
  3.  攔截指定包路徑中Person類中的void返回型別的"僅有一個String型別引數的"任意方法                             cut.setExpression("execution(void cn.hncu.aop.aspectj.Person.*(String)  )");
  4.  攔截指定包路徑中Person類中的"String"返回型別的僅有一個String型別引數的任意方法cut.setExpression("execution(String cn.hncu.aop.aspectj.Person.*(String)  )");
  5. 攔截指定包路徑中Person類中的"任意返回型別"、"方法名任意"、"僅有一個引數且型別任意"的方法cut.setExpression("execution(* cn.hncu.aop.aspectj.Person.*(*)  )");
  6. 攔截指定包路徑中Person類中的任意返回型別、方法名任意、"有且僅有兩個引數且型別任意"的方法cut.setExpression("execution(* cn.hncu.aop.aspectj.Person.*(*,*)  )");
  7. 攔截指定包路徑中Person類中的任意返回型別、方法名任意、"引數個數與型別均任意"的方法cut.setExpression("execution(* cn.hncu.aop.aspectj.Person.*(..)  )");
  8. 攔截指定包路徑中Person類中的任意返回型別、方法名任意、"第一個引數必須是int型,其它引數的個數與型別任意"的方法cut.setExpression("execution(* cn.hncu.aop.aspectj.Person.*(int,..)  )");
  9. 攔截指定包路徑中Person類中的任意返回型別、方法名任意、"至少有一個引數"的方法                       cut.setExpression("execution(* cn.hncu.aop.aspectj.Person.*(*,..)  )");
  10. 攔截"cn.hncu包中任意深的目錄中的類名以son結束的類"中Person類中的任意返回型別、方法名任意、至少一個引數的方法cut.setExpression("execution(* cn.hncu..*son.*(*,..)  )");

 

下面是XML配置使用Spring aop的步驟:

一、導包4+2

二、準備目標物件

三、準備通知

四、配置進行織入,將通知織入