輸出日志實例改成用Spring的AOP來實現


1.采用Interception Around通知的形式實現

Interception Around通知會在Join Point的前后執行,實現Interception Around通知的類需要實現接口MethodInterceptor。其實現思路是:

     1)首先實現接口MethodInterceptor,在Invoke()方法里編寫負責輸出日志信息的代碼,具體業務邏輯還使用前面的接口TimeBookInterface和它的實現類TimeBook

     2)然后在Spring的配置文檔中定義PointCut

     3)最后編寫測試程序,執行,查看輸出

 

   1)編寫負責輸出日志信息的類LogAround

   

//****LogAround.java****
package com.gc.action

import org.aopalliance.interceptor.MethodInvocation;
import org.aopalliance.interceptor.MethodInterceptor;
import org.apache.log4j.Level;
import org.apache.log4j.Logger;

//Interception Around通知會在Join Point的前后執行
public class LogAround implements MethodIntercetor{
      private Logger logger = Logger.getLogger(this.getClass().getName());
      //負責輸出日志信息的代碼
     public Object invoke(MethodInvocation mi) throw Throwabel{
           logger.log(Level.INFO,mi.getArguments()[0]+"開始審核數據...");
         try{
            Object result = mi.proceed();
            return result;
             }
         finally{
             logger.log(Level.INFO,mi.getArguments()[0]+"審核數據結束...")
                }
}
}    

參數MethodInvocation:通過它可以獲得方法的名稱,程序傳入的參數Object[]等

proceed方法,通過它即可執行被調用的方法

return result,返回值為被調用方法的返回值

    com.gc.impl包中的接口和 com.gc.action包中的類

//*****TimeBookInterface.java****

package com.gc.impl;
import org.apache.log4j.Level;

public interface TimeBookInterface{
    
    public void doAuding(String name); 
}


//*****TimeBook.java*******
package com.gc.action;
import com.gc.impl.TimeBookInterface;

public class TimeBook implements TimeBookInterface{
         public void doAuditing(String name){
         ....
}
}

    2)定義Spring的配置文檔config.xml

<!xml version="1.0" encoding = "UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
 "http://www.springframework.org/dtd/spring-beans.dtd"
>
<beans>
     <bean id="HelloWorld" class = "com.gc.action.HelloWorld" depends-on="date">
          <property name = "msg">
               <value>HelloWorld</value>
         </property>
         <property name = "date">
              <ref bean = "date"/>
        </property>
    </bean>
    <bean id="date" class="java.util.Date"/>
    
    <bean id="log" class="com.gc.action.LogAround"/>
    <bean id="timeBook" class="com.gc.action.TimeBook"/>
    <bean id="logProxy" class="org.springframework.aop.framework.ProxyFactoryBean">
        <property name="proxyInterfaces">
               <value>com.gc.impl.TimeBookInterface</value>
        </property>
       <property name="target">
          <ref Bean="timeBook"/>
       </proterty>
       <property name="interceportNames">
          <list>
               <value>log</value>
         </list>
      </property>
   </bean>
</beans>

   id為log的Bean,負責輸出日志信息;

   id為timeBook的Bean,負責具體的業務邏輯考勤審核

   id為logProxy的Bean,使用Spring提供的ProxyFactoryBean來實現代理,在該Bean里定義相關的屬性,包括要代理的接口,目標類急要使用的Interceptor。

  3)測試代碼

  

 1 //******TestHelloWorld*********
 2 
 3 package com.gc.test;
 4 
 5 import com.gc.action.TimeBook;
 6 import com.gc.aciton.TimeBookProxy;
 7 import com.gc.impl.TimeBookInterface;
 8 public class TestHelloWorld{
 9       public static void main(String[] args){
10           ApplicationContext actx = new FileSystemXmlApplicationContext("config.xml");
11           TimeBookInterface timeBookProxy = (TimeBookInterface)actx.getBean("logProxy");
12         timeBookProxy.doAuditing("張三");
13 }
14   
15 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM