隨筆-54  評論-0  文章-2  trackbacks-0

                今天主要是AOP編程,徐老師先講了原理,由淺入深,最 后讓開發由aspectJ來完成,使開發更簡單,收獲蠻大

          1.Aspect術語

           通知:切面的實際實現,他通知系統新的行為。如在日志通知包含了實

                現日志功能的代碼,如向日志文件寫日志。通知在連接點插入 到應用系統中。

          連接點::應用程序執行過程中插入切面的地點,可以是 方法調用,異常拋出,或者      要修改的字段。

          切入點:定義了通知應該應用在哪些連接點, 通知可以應用到AOP框架支持的任何         連接點。

                    

          引入:不變源代碼的情況下,為類添加新方法 和屬性。

          目標對象::被通知的對象。既可以是你編寫的類也可以是 第三方類。

          代理對象:嶄新的對象,將通知應用到目標對 象后創建的對象,應用系統的其他部              分不用為了支持代理對象而 改變。

          織入:將切面應用到目標對象從而創建一個新代理對 象的過程。織入發生在目標

                        對象生命周期的多個點上:

                         編譯期:切面在目標對象編譯時織入.這需要一個特殊的編譯器.

                         類裝載期:切面在目標對象被載入JVM時織入.這需要一個特殊的類載入器.

                         運行期:切面在應用系統運行時織入.

           4.切入點:定義了通知應該應用在哪些連接點,通知可以應用到AOP框架支持的任何連接點。

          兩種:jdk動態代理(接口,松耦合),cglib(對類代理)

          2.方法介紹

           .通知類型

           1.前置通知

             public interface MethodBeforeAdvice{

                 void before(Method m,Object[]

                           os ,Object target){

                  }

             }

             該接口提供了獲得目標方法、參數和目標對象的機會。不能夠改變運行時參數,即不能替換參數對象和目 標對象。

             注意在方法結束后不返回任何值東西。原因是該接口返回后,目標方法將會被調用,應該返回目標對象的 返回值。該接口唯一能

             阻止目標方法被調用的途徑是拋出異常或(System.exit())。

           2.動態代理對象ProxyFactoryBean是一個在BeanFactory中顯式創建代理對象的中心類,可以給它一個

           要實現的接口、一個要代理的目標對象、一個

           要織入的通知,并且他將創建一個嶄新的代理

           對象。

           3.后置通知

              同前置通知類似。

                  public interface AfterReturningAdvice{

                       public void afterReturning(Object returnValue,Method

                       m,Object[] os,Object target);

                  }

             多了一個返回值。

           4.環繞通知

                 public interface MethodInterceptor extends Interceptor{

                     Object invoke(MethodInvocation invocation);

                 }

                 該接口同前兩種通知有兩個重要區別:1.該通知能夠控制目標方法

                 是否真的被調用。通過invocation.proceed()方法來調用。

                 2.該通知可以控制返回的對象??梢苑祷匾粋€與proceed()方法返回對象完全不同的對象。但要謹慎使用。

                                                                   

           5.異常通知

                  public interface ThrowsAdvice{

                 }

                 該接口為標識性接口,沒有任何方法,但實現該接口的類必須要有如下形

                 式的方法:

                 void afterThrowing(Throwable throwable);

                 void afterThrowing(Method m,Object[] os,Object

                 target,Throwable throwable);

                 第一個方法只接受一個參數:需要拋出的異常。

                 第二個方法接受異常、被調用的方法、參數以及目標對象。

           .創建切入點方法

                  1. 切入點根據方法和類決定何處 織入通知。ClassFilter接口決定了一個類

                  是否符合通知的要求:

                  public interface ClassFilter{

                       boolean matches(Class clazz);

                  }

                  實現該接口的類決定了以參數傳遞 進來的類是否應該被通知。實現該接

                  口的類一般根據類名決定,但不一 定必須如此。

                 注意: 為減少系統負擔,盡量使用靜態切入點

                 

                  2.定義切入點      spring提供了Advisor類。他把通知和切入點組合到一個對象中。更確切地說PointcutAdvisor提供了這些功 能

          3.使用aspectJ開發

                 1.添加類庫:aspectjrt.jaraspectjweaver.jar

                 2.添加aop schema.

                 3.定義xml元素:<aop:aspectj-autoproxy>

                 4.編寫java,并用@Aspect注解成通知

                      AspectJ 支持 5 種類型的通知注解:

                  @Before: 前置通知, 在方法執行之前執行

                  @After: 后置通知, 在方法執行之后執行

                  @AfterRunning: 返 回通知, 在方法 返回結果之后執行

                  @AfterThrowing: 異 常通知, 在方法 拋出異常之后

                  @Around: 環繞通知, 圍繞著方法執行

                 配置成普通bean元素即可.

              注意:

              JoinPoint參數可訪問連接點細節,入方法名和參數等.

          今天知識點蠻多的,對面試挺有用的,好好掌 握!

              


          posted on 2010-02-28 01:11 d66380022 閱讀(267) 評論(0)  編輯  收藏
          主站蜘蛛池模板: 闻喜县| 邵阳县| 甘孜| 刚察县| 许昌市| 绥棱县| 裕民县| 化州市| 丘北县| 青阳县| 社旗县| 东辽县| 城固县| 梅河口市| 舒城县| 通道| 东至县| 吉安县| 青浦区| 乌拉特中旗| 大庆市| 根河市| 朝阳区| 资源县| 上饶县| 满洲里市| 久治县| 临桂县| 高邮市| 通江县| 五河县| 贡嘎县| 胶州市| 邢台市| 黄冈市| 昌宁县| 治多县| 天柱县| 肇州县| 宁城县| 陈巴尔虎旗|