<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆 - 312, 文章 - 14, 評論 - 1393, 引用 - 0
    數(shù)據(jù)加載中……

    eclipse + JBoss 5 + EJB3開發(fā)指南(15):攔截器方法和攔截器類

    本文為原創(chuàng),如需轉(zhuǎn)載,請注明作者和出處,謝謝!

    上一篇:eclipse + JBoss 5 + EJB3開發(fā)指南(14):消息驅(qū)動Bean

    一、攔截器方法

        EJB3可以通過攔截器對Bean方法進(jìn)行攔截和覆蓋。這有些象AOP中的around。通過AOP的around方法,可以修改被攔截方法的返回值、參數(shù)值,甚至可以取消被攔截方法的執(zhí)行。EJB3的攔截器可以用在無狀態(tài)Session Bean、有狀態(tài)Session Bean和消息驅(qū)動Bean(MDB)的方法中。實現(xiàn)攔截器的最簡單的方法是使用攔截器方法。也就是說,只要在當(dāng)前的Bean中使用@AroundInvoke對某個方法進(jìn)行注釋(關(guān)于攔截器的類都在javax.interceptor包中),那么這個方法就會變成攔截器方法,該攔截器方法會攔截當(dāng)前Bean中的所有方法。實現(xiàn)過程如下:
    @Stateful
    public class GreeterBean implements Greeter
    {
        @AroundInvoke
        
    public Object myInterceptorMethod1(InvocationContext ic) throws Exception
        {
            System.out.println(
    "myInterceptorMethod1:" + ic.getMethod().getName());
            obj 
    = ic.proceed();    
        }
        @AroundInvoke
        
    public Object myInterceptorMethod2(InvocationContext ic) throws Exception
        {
            System.out.println(
    "myInterceptorMethod2:" + ic.getMethod().getName());
            obj 
    = ic.proceed();    
        }
        @Override
        
    public String greet(String name)
        {
            
    return "hello " + name;
        }
    }

        上面的Stateful Session Bean中定義了兩個攔截器方法和一個Bean方法。當(dāng)客戶端調(diào)用greet方法時,EJB容器會先調(diào)用myInterceptorMethod1方法,然后會調(diào)用myInterceptorMethod2方法,最后會調(diào)用greet方法。使用攔截器方法時要注意如下幾點:
    1.  攔截器方法必須有一個返回值,返回值類型是Object。
    2.  攔截器方法只能有一個參數(shù),而且該參數(shù)類型必須是javax.interceptor.InvocationContext。
    3.  只有調(diào)用InvocationContext接口的proceed方法,EJB容器才會調(diào)用下一個攔截器方法或被攔截的Bean方法。
    4.  由于proceed方法要求拋出一個Exception異常,因此,攔截器方法必須拋出一個Exception異常,或在攔截器方法中使用try...catch來捕捉proceed方法拋出的異常。

    二、攔截器類
        有一些攔截器方法會攔截器不同Bean中的方法,在這種情況下,需要將攔截器方法放在一個單獨的類中。這個類就叫攔截器類。下面是一個攔截器類的代碼:
    package service;

    import javax.interceptor.AroundInvoke;
    import javax.interceptor.InvocationContext;

    public class MyInterceptor
    {
        @AroundInvoke
        
    public Object interceptorMethod(InvocationContext ic) throws Exception
        {
            System.out.println(
    "MyInterceptor:" + ic.getMethod().getName());
            
    return ic.proceed();
        }
    }

        為了使用該攔截器類,需要在SessionBean或MDB中使用@Interceptors來指定要使用的攔截器類。代碼如下:
    @Stateful
    @Interceptors(MyInterceptor.
    class)
    public class GreeterBean implements Greeter
    {
        @AroundInvoke
        
    public Object myInterceptorMethod1(InvocationContext ic) throws Exception
        {
            System.out.println(
    "myInterceptorMethod1:" + ic.getMethod().getName());
            obj 
    = ic.proceed();    
        }
        @AroundInvoke
        
    public Object myInterceptorMethod2(InvocationContext ic) throws Exception
        {
            System.out.println(
    "myInterceptorMethod2:" + ic.getMethod().getName());
            obj 
    = ic.proceed();    
        }
        @Override
        
    public String greet(String name)
        {
            
    return "hello " + name;
        }
    }

        如果有多個攔截器類,可以使用如下的代碼來指定這些攔截器類:
       
    @Interceptors({MyInterceptor.class, MyInterceptor1.class})

        如果指定了多個攔截器類和攔截器方法,就涉及到一個調(diào)用順序的問題。EJB容器會先調(diào)用攔截器類中的攔截器方法、如果有多個攔截器類被指定,按指定的順序進(jìn)行調(diào)用。也就是說,MyInterceptor類中的攔截器方法會最先被調(diào)用,然后是MyInterceptor1類中的攔截器方法。最后會調(diào)用在Bean中定義的攔截器方法(myInterceptorMethod1和myInterceptorMethod2)。
        在默認(rèn)情況下,攔截器類將攔截所有的Bean方法,但可以使用@ExcludeClassInterceptors注釋來阻止攔截器對某個Bean方法進(jìn)行攔截。如在GreeterBean類中還有一個getValue方法,那么阻止該方法被攔截的代碼如下:

    @ExcludeClassInterceptors
    public String getValue()
    {
        
    return "abcd";
    }

        使用@ExcludeClassInterceptors只能阻止攔截器類中的攔截器方法對Bean方法的攔截,而在Bean中定義的攔截器方法仍然會攔截Bean方法。





    Android開發(fā)完全講義(第2版)(本書版權(quán)已輸出到臺灣)

    http://product.dangdang.com/product.aspx?product_id=22741502



    Android高薪之路:Android程序員面試寶典 http://book.360buy.com/10970314.html


    新浪微博:http://t.sina.com.cn/androidguy   昵稱:李寧_Lining

    posted on 2009-06-14 11:00 銀河使者 閱讀(1936) 評論(0)  編輯  收藏 所屬分類: 原創(chuàng)ejb3JBoss

    主站蜘蛛池模板: 99久久久国产精品免费无卡顿 | 亚洲最大无码中文字幕| 一个人免费视频在线观看www | 亚洲无线观看国产精品| 一个人看的www视频免费在线观看 一个人看的免费观看日本视频www | 国产人成网在线播放VA免费| 亚洲精品成人片在线观看| 黄色一级视频免费| 亚洲男人av香蕉爽爽爽爽| g0g0人体全免费高清大胆视频| 亚洲成年看片在线观看| 久99久无码精品视频免费播放| 亚洲大尺度无码无码专区| 亚洲人成伊人成综合网久久久| 国产精品永久免费| 国产AV无码专区亚洲精品| 99久久精品免费视频| 久久精品国产亚洲AV蜜臀色欲| 中国一级特黄的片子免费| 亚洲高清专区日韩精品| 最近免费中文字幕大全高清大全1 最近免费中文字幕mv在线电影 | 日韩色视频一区二区三区亚洲| 亚洲综合精品网站| 国产三级在线免费| 亚洲一级黄色大片| 日韩精品电影一区亚洲| 日本视频免费高清一本18| 亚洲av乱码一区二区三区| 免费在线视频一区| 亚洲精品无码av中文字幕| 全亚洲最新黄色特级网站| 久久这里只精品99re免费| 亚洲午夜精品久久久久久app| 亚洲情侣偷拍精品| 曰批全过程免费视频网址| 亚洲伦理一区二区| 成人免费网站在线观看| 本免费AV无码专区一区| 亚洲Av高清一区二区三区| 国产日韩成人亚洲丁香婷婷| 免费看片在线观看|