posts - 21,  comments - 6,  trackbacks - 0

          Spring AOP Framework

          ?

          Here's my little exploration to Spring's AOP framework - a little interceptor which just logs which class is called and which method is called, plus logging the method invocation time; however I hope this can help others to understand Spring's AOP and help them to write interceptors of their own.

          -cptechno


          An interceptor used in Spring need to implement the org.aopalliance.intercept.MethodInterceptor interface, which requires implementing this method:



          public? Object?invoke(MethodInvocation?methodInvocation)? throws? Throwable;



          And next, comes that little interceptor...



          import? org.aopalliance.intercept.MethodInterceptor;
          import? org.aopalliance.intercept.MethodInvocation;
          import? org.apache.commons.logging.Log;
          import? org.apache.commons.logging.LogFactory;

          public?class? MyInterceptor? implements? MethodInterceptor
          {
          ?? private?final? Log?logger?=?LogFactory.getLog(getClass());

          ?? public? Object?invoke(MethodInvocation?methodInvocation)? throws? Throwable
          ?? {
          ???? logger.info( "Beginning?method:?"? +?methodInvocation.getMethod().getDeclaringClass()?+? "::"? +?methodInvocation.getMethod().getName());
          ???? long? startTime?=?System.currentTimeMillis();
          ???? try
          ???? {
          ?????? Object?retVal?=?methodInvocation.proceed();
          ?????? return? retVal;
          ???? }
          ???? finally
          ???? {
          ?????? logger.info( "Ending?method:?"?? +?methodInvocation.getMethod().getDeclaringClass()?+? "::"? +?methodInvocation.getMethod().getName());
          ?????? logger.info( "Method?invocation?time:?"? +?(System.currentTimeMillis()?-?startTime)?+? "?msecs." );
          ???? }
          ?? }

          }



          You can do anything as you like; but pay attention to these two lines:



          Object?retVal?=?methodInvocation.proceed();
          return? retVal;



          The execution sequence is as follows:

          1. Any statements placed before Object retVal = methodInvocation.proceed();
          2. Object retVal = methodInvocation.proceed(); , which gives control to the next interceptor in the interceptor stack, or the underlying method.
          3. Any statements placed before return retVal;
          4. return retVal; , which returns control to the interceptor above it, or exit the whole interceptor stack.

          Next, to use the interceptor we wrote, we need to turn our business object as an AOP target, like this:



          <bean?id= "SearchBookBeanTarget"? class = "library.SearchBookBeanImpl"? init-method= "init"? />



          As shown, we just need to change the bean's id.

          Next we need to hang the interceptor on to Spring's ApplicationContext.



          <bean?id= "myInterceptor"? class = "library.MyInterceptor"? />



          And the last step, we declare our business object actually in the ApplicationContext, via its interface we defined, via Spring's ProxyFactoryBean.



          <bean?id= "SearchBookBean"? class = "org.springframework.aop.framework.ProxyFactoryBean" >
          ?? <property?name= "proxyInterfaces" ><value>library.SearchBookBean</value></property>
          ???? <property?name= "interceptorNames" >
          ?????? <list>
          ???????? <value>myInterceptor</value>
          ???????? <value>SearchBookBeanTarget</value>
          ?????? </list>
          ???? </property>
          ?? </bean>

          • proxyInterfaces: the actual business interface of our business object.
          • interceptorNames: the execution sequence of the interceptors, with the business object's target as the end of the list. Remember to put the business object's target on the list, otherwise your business object will not work; on the other hand you'll receive an exception telling you that all interceptors had been invoked.

          On the application code that will access the business object, no changes are necessary.



          Then at your logging target (console, file, etc...) you can see the following output similar to this (time and level info trimmed here):



          Beginning?method:? interface? library.SearchBookBean::searchBook
          ....
          (log?messages?about?library.SearchBookBean.searchBook()....)
          ....
          Ending?method:? interface? library.SearchBookBean::searchBook
          Method?invocation?time:? 10? msecs.

          posted on 2006-09-27 21:07 Warren.Wu 閱讀(274) 評(píng)論(0)  編輯  收藏

          只有注冊(cè)用戶(hù)登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 英吉沙县| 柯坪县| 崇义县| 桑植县| 大竹县| 健康| 镇巴县| 商南县| 铜梁县| 龙里县| 永丰县| 凌云县| 镇坪县| 梁平县| 齐齐哈尔市| 铅山县| 金溪县| 沁源县| 祁阳县| 凤山市| 进贤县| 汨罗市| 呼和浩特市| 南溪县| 迁安市| 苏尼特左旗| 山阳县| 金平| 吴江市| 中方县| 舞钢市| 宜良县| 封开县| 建水县| 黔西县| 清流县| 讷河市| 大安市| 炉霍县| 郓城县| 奈曼旗|