spring 基於AOP模擬日誌列印
阿新 • • 發佈:2019-01-01
一、控制方法執行列印日誌、執行後列印日誌、讓指定方法列印日誌
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("明天"); } }