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

          2009年2月10日

          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 閱讀(494) | 評(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簡(jiǎn)化了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 --單元測(cè)試用例。
                OrderManger.java的NodifyOrder()函數(shù) --實(shí)際應(yīng)用的地方。 

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

          posted @ 2009-02-11 09:52 Pitey 閱讀(260) | 評(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.aygfsteel.com/calvin/archive/2008/07/09/213535.html

          posted @ 2009-02-11 09:17 Pitey 閱讀(169) | 評(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.測(cè)試一下前置通知

          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.測(cè)試一下返回后通知

          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)盡量使用最簡(jiǎn)單的滿足你需求的通知。(比如如果前置通知(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.測(cè)試一下環(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 閱讀(1689) | 評(píng)論 (0)編輯 收藏

          主站蜘蛛池模板: 海南省| 禹州市| 古交市| 濮阳县| 兴和县| 巴塘县| 武宁县| 天峨县| 石柱| 梨树县| 武平县| 玉门市| 齐齐哈尔市| 芦山县| 兴海县| 弥勒县| 泸水县| 镇雄县| 阳江市| 武冈市| 眉山市| 微山县| 台东县| 宜宾市| 郁南县| 南京市| 吴堡县| 山东省| 额敏县| 常宁市| 观塘区| 富宁县| 多伦县| 佛冈县| 新竹县| 绍兴市| 北碚区| 富平县| 于田县| 依安县| 拜泉县|