Spring aop(4)---aspectj
阿新 • • 發佈:2018-12-26
今天講一下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);
採用切點語言定義切點表示式
- 攔截指定包路徑中Person類中的void返回型別的空參run方法 cut.setExpression("execution(void cn.hncu.aop.aspectj.Person.run() )");
- 攔截指定包路徑中Person類中的void返回型別的空參"任意"方法 cut.setExpression("execution(void cn.hncu.aop.aspectj.Person.*() )");
- 攔截指定包路徑中Person類中的void返回型別的"僅有一個String型別引數的"任意方法 cut.setExpression("execution(void cn.hncu.aop.aspectj.Person.*(String) )");
- 攔截指定包路徑中Person類中的"String"返回型別的僅有一個String型別引數的任意方法cut.setExpression("execution(String cn.hncu.aop.aspectj.Person.*(String) )");
- 攔截指定包路徑中Person類中的"任意返回型別"、"方法名任意"、"僅有一個引數且型別任意"的方法cut.setExpression("execution(* cn.hncu.aop.aspectj.Person.*(*) )");
- 攔截指定包路徑中Person類中的任意返回型別、方法名任意、"有且僅有兩個引數且型別任意"的方法cut.setExpression("execution(* cn.hncu.aop.aspectj.Person.*(*,*) )");
- 攔截指定包路徑中Person類中的任意返回型別、方法名任意、"引數個數與型別均任意"的方法cut.setExpression("execution(* cn.hncu.aop.aspectj.Person.*(..) )");
- 攔截指定包路徑中Person類中的任意返回型別、方法名任意、"第一個引數必須是int型,其它引數的個數與型別任意"的方法cut.setExpression("execution(* cn.hncu.aop.aspectj.Person.*(int,..) )");
- 攔截指定包路徑中Person類中的任意返回型別、方法名任意、"至少有一個引數"的方法 cut.setExpression("execution(* cn.hncu.aop.aspectj.Person.*(*,..) )");
- 攔截"cn.hncu包中任意深的目錄中的類名以son結束的類"中Person類中的任意返回型別、方法名任意、至少一個引數的方法cut.setExpression("execution(* cn.hncu..*son.*(*,..) )");
下面是XML配置使用Spring aop的步驟:
一、導包4+2
二、準備目標物件
三、準備通知
四、配置進行織入,將通知織入