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

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

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

    隨筆 - 8, 文章 - 0, 評(píng)論 - 4, 引用 - 0
    數(shù)據(jù)加載中……

    2008年3月18日

    Java靜態(tài)代理和動(dòng)態(tài)代理

    網(wǎng)上和bolg上相關(guān)例子不少,今天自己動(dòng)手寫了個(gè)例子作為學(xué)習(xí)筆記。
    首先java代理分為靜態(tài)代理和動(dòng)態(tài)代理,動(dòng)態(tài)代理中java提供的動(dòng)態(tài)代理需要?jiǎng)討B(tài)代理一個(gè)inteface,如果沒有inteface則需要使用實(shí)現(xiàn)cglib提供的接口。
    下面例子只實(shí)現(xiàn)動(dòng)態(tài)代理
    public class MyProxy implements InvocationHandler{
        
        
    static Object proxyObj = null;    
        
        
    public static Object getInstance(Object obj){
            proxyObj
    = obj;
            
    return Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), new MyProxy());
        }

        
        
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
            System.out.println(
    "使用代理..");
            
    return method.invoke(proxyObj, args);
        }

    }

    實(shí)現(xiàn)方式
    public static void main(String[] args) {
            ILeaveService service 
    = (ILeaveService)MyProxy.getInstance(new LeaveServiceImpl());
            
    try {
                service.listBizObjByHql(
    "");
            }

            
    catch (ServiceException e) {
                e.printStackTrace();
            }

        }

    打印出:
    使用代理..
    query Hql..
    使用Cglib
    public class Test2 implements MethodInterceptor {
            
        
        
    public Object intercept(Object obj, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
            System.out.println(
    "cglib proxy");
            
    return methodProxy.invokeSuper(obj, args);
        }

        
    }

    實(shí)現(xiàn)
    public static void main(String[] args) {
            Enhancer enhancer 
    = new  Enhancer();
            enhancer.setSuperclass(Test3.class);
            enhancer.setCallback(new Test2());        

            Test3 test 
    = (Test3)enhancer.create();
            test.prinInfo(
    "p.");
        }
    輸出
    cglib proxy
    p.
    過濾器
    public class Test4 implements CallbackFilter{

        
    public int accept(Method method) {
            
    if(method.getName().equals("method1")){
                
    return 1;
            }
    else if(method.getName().equals("method2")){
                
    return 0;
            }

            
    return 0;
        }

        
    }
    只有返回0的才執(zhí)行(cglib中的NoOp.INSTANCE就是一個(gè)空的攔截器
        public static void main(String[] args) {        
            Callback [] callbacks 
    = new Callback[]{new Test2(),NoOp.INSTANCE};
            Enhancer enhancer 
    = new Enhancer();
            enhancer.setSuperclass(Test3.
    class);
            enhancer.setCallbacks(callbacks);
            enhancer.setCallbackFilter(
    new Test4());
            Test3 test3 
    = (Test3)enhancer.create();
            test3.method1();
            test3.method2();
        }

        
    }

    執(zhí)行結(jié)果
    method1
    cglib proxy
    method2

    posted @ 2009-02-18 16:52 Pitey 閱讀(489) | 評(píng)論 (0)編輯 收藏

    轉(zhuǎn):Message Driven POJO

    作者:江南白衣 
      
        一直希望那些J字頭的協(xié)議能有幾個(gè)提前告老還鄉(xiāng)的,好減輕一下我們的負(fù)擔(dān),特別是這WebService滿天飛的時(shí)代。但似乎還有很久都輪不到JMS的消失:

        1.因?yàn)?br />     1.它是《Effective Enterprise Java》的一個(gè)實(shí)踐。 
        可以把不影響用戶執(zhí)行結(jié)果又比較耗時(shí)的任務(wù)(比如發(fā)郵件通知管理員)異步的扔給JMS 服務(wù)端去做,而盡快的把屏幕返還給用戶。
        而且服務(wù)端能夠多線程排隊(duì)響應(yīng)--高并發(fā)的請(qǐng)求。

        2. 可以在Java世界里達(dá)到最高的解耦。
           對(duì)比WebService,JMS的客戶端與服務(wù)端無需直連,甚至無需知曉對(duì)方是誰、在哪里、有多少人,只要對(duì)流過的信息作響應(yīng)就行了。對(duì)牽一發(fā)動(dòng)全身的企業(yè)應(yīng)用來說很輕省。
           
         2. 但是
         1. Message Bean帶著EJB系的榮光,步驟比較繁雜,你需要實(shí)現(xiàn)MessageDrivenBean、MessageListener接口,還需要設(shè)置EJB的配置信息,然后是deploy....

         2. Spring 1.x 提供的JMS Template簡化了JMS Client端的編程,但并沒有涉及到服務(wù)端的改造。

         3. 所以,SpringSide的Message Driven POJO方案

          Spring JMS Template + ActiveMQ + Jencks

    1. 它是Lightweight的,基本上只是普通POJO,不用搞太多東西。

    2. 它是Spring Base的,可以使用Spring的各種特性如IOC、AOP。

    3. 它是Effective的,基于Jencks的JCA Container實(shí)現(xiàn) pool connection,control transactions and manage security。

    4. 但它是withdout EJB Container的。

    其實(shí)它還不是100% POJO,除非再用上Lingo,但我已不想走得太遠(yuǎn)。

    4.黃金版配置
          如果你想找一個(gè)ActiveMQ 3.2 Stable版+Spring的100%可行的配置文件,估計(jì)只能到SpringSide項(xiàng)目里看了。網(wǎng)上的文章,不是已過時(shí),就是不切題。

         推薦中英兩份最接近的文檔:
         捷特慈朋(IDEA中國): Spring和Message Bean的整合
         Spring loaded:  Message-Driven POJOs 

         不過它們都有個(gè)outdate的地方--ActiveMQ3.2開始不再自帶JCA Cotainer了,而是將其與Gernimo 合作而成了Jencks,需另外安裝。

     5.SpringSide旅游指南

          pom.xml里的JMS部分 --所需的依賴包。
          applicationContext-jms.xml --黃金版配置文件。
          activemq.xml  --AcitveMQ Broker配置文件。
          OrderPlaceMDP.java --Message Driven Pojo。
          JmsTest.java --單元測試用例。
          OrderManger.java的NodifyOrder()函數(shù) --實(shí)際應(yīng)用的地方。 

     POJO太簡單,唯一麻煩的配置文件已注釋,這里也就無話了。

    posted @ 2009-02-11 09:52 Pitey 閱讀(254) | 評(píng)論 (0)編輯 收藏

    [導(dǎo)入]一次Java垃圾收集調(diào)優(yōu)實(shí)戰(zhàn)

         摘要: GC調(diào)優(yōu)是個(gè)很實(shí)驗(yàn)很伽利略的活兒,最后服務(wù)的處理速度從1180 tps 上升到1380 tps,調(diào)整兩個(gè)參數(shù)提升17%的性能還是筆很劃算的買賣.....  閱讀全文


    文章來源:http://www.tkk7.com/calvin/archive/2008/07/09/213535.html

    posted @ 2009-02-11 09:17 Pitey 閱讀(163) | 評(píng)論 (0)編輯 收藏

    Spring事物攔截器學(xué)習(xí)筆記

    Spring事物攔截器,按照通知方式分為[前置通知(Before advice),返回后通知(After returning advice)
    ,拋出后通知(After throwing advice),后通知(After (finally) advice),環(huán)繞通知(Around Advice)]
    配置方式分@AspectJ,XML,網(wǎng)上比較多的是Spring1.1或xml+@AspectJ方式配置,例子使用XML方式配置

    1.定義切面類接口,切面類實(shí)現(xiàn)這個(gè)接口。聲明(如果被代理的目標(biāo)對(duì)象實(shí)現(xiàn)了至少一個(gè)接口,則會(huì)使用JDK動(dòng)態(tài)代理。所有該目標(biāo)類型實(shí)現(xiàn)的接口都將被代理。若該目標(biāo)對(duì)象沒有實(shí)現(xiàn)任何接口,則創(chuàng)建一個(gè)CGLIB代理)

    public interface ITestAdvice {
     
     
    public void doPlay();
     
     
    public void doStop(Object reval);

    }



    public class Tv implements ITestAdvice{
     
     
     
    public void doStop(Object reval) {
      System.out.println(reval.toString() 
    + "關(guān)閉電視機(jī)!");
     }

     
     
    public void doPlay() {
      System.out.println(
    "打開電視機(jī)!");
     }

     
    }


     

    2.定義前置通知攔截處理類

     

    public class TestMethodBeforeAdvice  {
     
     
    public void before(JoinPoint jpt) {  //參數(shù)JoinPoint為默認(rèn)參數(shù)
      System.out.println(
    "正在打開電視..");
     }

     
    }



    3.定義攔截器配置文件

    <bean id="tv" class="com.pitey.demo.Tv" />
    <bean id="beforeAdvice" class="com.pitey.demo.TestMethodBeforeAdvice" />
     
     
    <aop:aspectj-autoproxy proxy-target-class="true"/>
     
    <aop:config>
      
    <!-- 定義切入點(diǎn) -->
      
    <aop:pointcut id="methodAdvice" expression="execution(* com.pitey.demo.*.*(..))" />
      
    <!-- 定義切面 -->
      
    <aop:aspect id="beforeAdviceAspect" ref="beforeAdvice">
       
    <!-- 定義前置通知 -->   
       
    <aop:before method="before" pointcut-ref="methodAdvice"/>    
     
    </aop:config>


    4.測試一下前置通知

    public static void main(String[] args) {
            ApplicationContext context 
    = new ClassPathXmlApplicationContext("config\\advice.xml");
            Tv tv 
    = (Tv)context.getBean("tv");
            tv.doPlay();        
        }


    結(jié)果:
                正在打開電視機(jī)..
                打開電視機(jī)


    5.定義返回后通知攔截處理類

    public class TestAfterReturnAdvice {
     
     
    public void afterReturning(Object retVal) throws Throwable {
      String returnVal 
    = 電視機(jī)已經(jīng)打開!";
      System.out.println(returnVal);
      retVal
    = (Object)returnVal;
     }

     
    }



    6.定義攔截器配置文件

     

    <bean id="afterReturnAdvice" class="com.pitey.demo.TestAfterReturnAdvice"/>
     
    <aop:config>
      
    <!-- 定義切面 -->
      
    <aop:aspect id="afterReturnAdviceAspect" ref="afterReturnAdvice">
       
    <!-- 定義后置返回通知  -->   
       
    <aop:after-returning method="afterReturning" pointcut-ref="methodAdvice" returning="retVal"/> //returing 為返回參數(shù)
     </aop:config>


    7.測試一下返回后通知

    public static void main(String[] args) {
            ApplicationContext context 
    = new ClassPathXmlApplicationContext("config\\advice.xml");
            Tv tv 
    = (Tv)context.getBean("tv");
            tv.doPlay();        
        }


    結(jié)果:
                正在打開電視機(jī)..
                打開電視機(jī)
                電視機(jī)已經(jīng)打開
    !


    8.定義環(huán)繞通知攔截處理類(環(huán)繞通知在一個(gè)方法執(zhí)行之前和之后執(zhí)行。 它使得通知有機(jī)會(huì)既在一個(gè)方法執(zhí)行之前又在執(zhí)行之后運(yùn)行。并且,它可以決定這個(gè)方法在什么時(shí)候執(zhí)行,如何執(zhí)行,甚至是否執(zhí)行。 環(huán)繞通知經(jīng)常在在某線程安全的環(huán)境下,你需要在一個(gè)方法執(zhí)行之前和之后共享某種狀態(tài)的時(shí)候使用。 請(qǐng)盡量使用最簡單的滿足你需求的通知。(比如如果前置通知(before advice)也可以適用的情況下不要使用環(huán)繞通知))
    通知方法的第一個(gè)參數(shù)的類型必須是 ProceedingJoinPoint 類型。在通知的主體中,調(diào)用 ProceedingJoinPointproceed() 方法來執(zhí)行真正的方法。 proceed 方法也可能會(huì)被調(diào)用并且傳入一個(gè) Object[] 對(duì)象 - 該數(shù)組將作為方法執(zhí)行時(shí)候的參數(shù)。

    public class TestMethodIntercepor{
     
     
    public Object doBasicProfiling(ProceedingJoinPoint  pjp) throws Throwable {
      System.out.println(
    "begining");
      Object obj 
    = pjp.proceed();
      
      System.out.println(
    "ending..");
      
    return obj;
     }
     
    }




    9.定義攔截器配置文件

     

    <bean id="aroundAdvice" class="com.pitey.demo.TestMethodIntercepor"/>
     
    <aop:config>
      
    <!-- 定義切面 -->
      
    <aop:aspect id="aroundAspect" ref="aroundAdvice">
     
    <aop:around method="doBasicProfiling" pointcut-ref="methodBeforeAdvice"/>
      
    </aop:aspect>
     
    </aop:config>



    10.測試一下環(huán)繞通知

    public static void main(String[] args) {
            ApplicationContext context 
    = new ClassPathXmlApplicationContext("config\\advice.xml");
            Tv tv 
    = (Tv)context.getBean("tv");
            tv.doPlay();        
        }


    結(jié)果:
                begining
                打開電視機(jī)
                ending..

    posted @ 2009-02-10 23:07 Pitey 閱讀(1684) | 評(píng)論 (0)編輯 收藏

    轉(zhuǎn):重寫window.setTimeout傳參數(shù)(支持傳對(duì)象)的方法

    也許你過去在setTimeout中傳參數(shù)一直是這樣

    setTimeout("pass(" + argu + ")",1000)

    這樣只能傳字符串,對(duì)傳遞object就無能為力了,需要大費(fèi)文章.然而別忘了,第一個(gè)參數(shù)還可以是function!!!

    看以下代碼實(shí)現(xiàn)向里面的function 傳參數(shù)

    <script type="text/javascript">
    var _st = window.setTimeout;window.setTimeout = function(fRef, mDelay) {
    if(typeof fRef == 'function'){ 
      var argu 
    = Array.prototype.slice.call(arguments,2); 
      var f 
    = (function(){ fRef.apply(null, argu); }); 
      return _st(f, mDelay); }
      return
     _st(fRef,mDelay);}

    function test(x){ alert(x);}
    window.setTimeout(test,
    1000,'fason');
    </
    script>

    怎樣?是不是很方便了?代碼其實(shí)就很簡單,重載了一下window.setTimeout,用apply去回調(diào)前面的function.

    還沒有用過apply,call的可以去查資料,發(fā)現(xiàn)版本不夠的看我低版本的實(shí)現(xiàn)方法http://blog.csdn.net/fason/archive/2004/07/30/apply_call.aspx

    另外需要知道的是,NS環(huán)境下,后面的參數(shù)確實(shí)是來傳給前面的函數(shù)的,IE爛,沒有實(shí)現(xiàn)~~~~~~~~~~~~~

    posted @ 2008-03-18 10:21 Pitey 閱讀(3673) | 評(píng)論 (1)編輯 收藏

    主站蜘蛛池模板: 免费观看毛片视频| 久久免费美女视频| 亚洲AV电影天堂男人的天堂| 亚洲国产成a人v在线| 亚洲欧洲一区二区| 亚洲视频在线观看| 亚洲视频一区二区三区| 久久久无码精品亚洲日韩按摩 | 久久国产乱子伦精品免费午夜| 老司机亚洲精品影院在线观看| 亚洲av无码一区二区三区在线播放| 亚洲成av人无码亚洲成av人| 精品国产日韩亚洲一区91| 校园亚洲春色另类小说合集| 边摸边吃奶边做爽免费视频网站 | 67194在线午夜亚洲| 亚洲色偷偷综合亚洲av78| 亚洲国产精品18久久久久久| 久久久久久亚洲精品无码| 男女污污污超污视频免费在线看| 4hu四虎免费影院www| 国产免费无码一区二区| 24小时日本韩国高清免费| 成人免费a级毛片无码网站入口 | 在线观看无码的免费网站| 日本成人在线免费观看 | 7x7x7x免费在线观看| 国产国产人免费视频成69堂| 18禁超污无遮挡无码免费网站国产 | 久青草视频在线观看免费 | 色偷偷亚洲男人天堂| 人与动性xxxxx免费| 日本视频在线观看永久免费| 国产91免费视频| 在线免费观看国产视频| 国产精品亚洲mnbav网站| 久久精品国产亚洲AV无码偷窥| 日韩亚洲不卡在线视频中文字幕在线观看| 亚洲AV无码专区在线电影成人| www免费插插视频| 1000部无遮挡拍拍拍免费视频观看|