1. 程式人生 > >spring 基於AOP模擬日誌列印

spring 基於AOP模擬日誌列印

一、控制方法執行列印日誌、執行後列印日誌、讓指定方法列印日誌

1.指定方法列印日誌

(1)在invoke()方法中加一個對method名字的判斷,其中method的名字可以寫在xml檔案中。

二、程式碼實現

1.ILogger程式碼

public interface ILogger {
     void start(Method method);
     void end(Method method);
 }
public class DLogger implements ILogger{
    @Override
    public void start(Method method) {
        System.out.println(new Date()+ method.getName() + " say hello start...");
    }
    @Override
    public void end(Method method) {
        System.out.println(new Date()+ method.getName() + " say hello end");
    }
}

2.動態代理類

public class DynaProxyHello1 implements InvocationHandler{
    //呼叫物件
    private Object proxy;
    //目標物件
    private Object target;
    
    public Object bind(Object target,Object proxy){
        this.target=target;
        this.proxy=proxy;
        return Proxy.newProxyInstance(this.target.getClass().getClassLoader(), this.target.getClass().getInterfaces(), this);
    }
    
    
    @Override
    public Object invoke(Object proxy, Method method, Object[] args)throws Throwable {
        Object result = null;
        //反射得到操作者的例項
        Class clazz = this.proxy.getClass();
        //反射得到操作者的Start方法
        Method start = clazz.getDeclaredMethod("start", new Class[]{Method.class});
        //反射執行start方法
        start.invoke(this.proxy, new Object[]{this.proxy.getClass()});
        //執行要處理物件的原本方法
        result=method.invoke(this.target, args);
        //反射得到操作者的end方法
        Method end = clazz.getDeclaredMethod("end", new Class[]{Method.class});
        //反射執行end方法
        end.invoke(this.proxy, new Object[]{method});
        return result;
    }
    
}

3.測試程式碼

public interface IHello {
    /**
     * 業務方法
     * @param str
     */
    void sayHello(String str);
}
public class Hello implements IHello{
    @Override
    public void sayHello(String str) {
        System.out.println("hello "+str);
    }
    
}
public class DynaTest1 {
    public static void main(String[] args) {
        //如果我們需要日誌功能,則使用代理類
        IHello hello = (IHello) new DynaProxyHello1().bind(new Hello(),new DLogger());
        //IHello hello = new Hello();//如果我們不需要日誌功能則使用目標類
        hello.sayHello("明天");
    }
}