熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java開源技術 >> 正文

Spring AOP之Hello World

2013-11-23 20:40:19  來源: Java開源技術 

  我們使用一個簡單的例子來演示一下Spring中的AOP這是一個log的例子實際上log是一個對於AOP來說很不好的例子這裡我們只為說明Spring AOP的使用
  
  首先我們來創建一個自己的interceptor
  這個類必須繼承orgaopallianceintercept MethodInterceptor接口Spring的AOP框架就是參照aopalliance這個標准實現的所以我們的MyInterceptor要繼承這個標准中的接口
  這個接口只有一個要求實現的方法
  public Object invoke(MethodInvocation methodInvocation) throws Throwable;
  下面是我們的MyIntercptor
  
  public class MyInterceptor implements MethodInterceptor {
  private final Log logger = LogFactorygetLog(getClass());
  
  public Object invoke(MethodInvocation methodInvocation) throws Throwable {
  (Beginning method (): +
  methodInvocationgetMethod()getDeclaringClass() + +
  methodInvocationgetMethod()getName() + ());
  long startTime = SystemcurrentTimeMillis();
  try{
  Object result = methodInvocationproceed();
  return result;
  }finally{
  (Ending method (): +
  methodInvocationgetMethod()getDeclaringClass() + +
  methodInvocationgetMethod()getName() + ());
  (Method invocation time (): +
  (SystemcurrentTimeMillis() startTime) + ms);
  }
  }
  }
  
  對於上面的代碼需要說明的是下面兩行代碼
  Object result = methodInvocationproceed();
  return result;
  整個程序的流程是這樣的
  先是執行在Object result = methodInvocationproceed();前面的代碼
  接著執行Object result = methodInvocationproceed();它把執行控制權交給了interceptor stack(攔截器棧)內的下一個interceptor如果沒有了就交給真正的業務方法
  然後執行return result;之前的代碼
  最後執行return result;它把控制權交回它之上的interceptor如果沒有了就退出interceptor stack
  
  寫出我們的業務對象及其接口
  為了方便我們的業務接口只有一個hello方法
  
  public interface BusinessInterface {
  public void hello();
  }
  
  業務對象的代碼如下
  
  public class BusinessInterfaceImpl implements BusinessInterface{
  public void hello() {
  Systemoutprintln(hello Spring AOP);
  }
  }
  
  接下來我們來看看如何使用我們的寫的interceptor
  我們把業務對象作為AOP的target
  <bean id=businessTarget class=comrstspringtestaopBusinessInterfaceImpl/>
  接著在bean定義中聲明interceptor
  <bean id=myInterceptor class=comrstspringtestaopMyInterceptor/>
  最後我們來聲明真正的業務對象通過使用它的接口以及Spring的ProxyFactoryBean
  
  <bean id=businessBean
    class=orgspringframeworkaopframeworkProxyFactoryBean>
  <property name=proxyInterfaces>
  <value>comrstspringtestaopBusinessInterface</value>
  </property>
  <property name=interceptorNames>
  <list>
  <value>myInterceptor</value>
  <value>businessTarget</value>
  </list>
  </property>
  </bean>
  
  這裡需要說明兩點
  proxyInterfaces就是我們的業務對象的實際接口
  interceptorNames定義了所有interceptors的執行順序其中業務對象的target作為list的最後一個記著一定要把業務對象的target放到list中否則你的業務對象就不會工作
  
  最後寫我們的測試類
  ClassPathResource resource =
  new ClassPathResource(com/rst/spring/testaop/aop_beanxml);
  XmlBeanFactory beanFactory = new XmlBeanFactory(resource);
  BusinessInterface businessBean =
  (BusinessInterface) beanFactorygetBean(businessBean);
  businessBeanhello();
  
  一切正常就可以在log上看到相應的信息了
  以下是附件源代碼的執行效果
   :: INFO Beginning method (): interface comrstspringtestaopBusinessInterfacehello()
   :: INFO Beginning method (): interface comrstspringtestaopBusinessInterfacehello()
  hello Spring AOP
   :: INFO Ending method (): interface comrstspringtestaopBusinessInterfacehello()
   :: INFO Ending method (): interface comrstspringtestaopBusinessInterfacehello()
   :: INFO Method invocation time (): ms
  源代碼需要springjar aopalliencejar commonsloggingjar

From:http://tw.wingwit.com/Article/program/Java/ky/201311/28872.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.