大家都知道在ssh组合的框架中spring扮演了一个极其重要的中间角色:既可以使用ioc解耦,也可以使用aop来对功用的方法进行重用。其实aop这种思想早就在j2se中就有体现了,是通过使用InvocationHandler接口和动态代理Proxy来实现的。废话不多说:下面就先上我写的一个小例子:
首先模仿spring写一个Logger类来模拟日志记录
Logger.class
package com.aopanalysis;
public class Logger {
public static void logging(String level , String content){
if(level.equals("log")){
System.out.println("LOG:"+content+"(LOG ok)");
}else if(level.equals("debug")){
System.out.println("DEBUG:"+content+"(DEBUG ok)");
}else {
System.out.println("NO FOUND EQUALED CMD!");
}
}
}
Hello.class
package com.aopanalysis;
public class Hello implements IHello {
String name;
public Hello(String name){
this.name = name;
}
@Override
public void sayHello(String name) {
// TODO Auto-generated method stub
System.out.println("Hello "+name+"!");
}
@Override
public void sayGoodbye(String name) {
// TODO Auto-generated method stub
System.out.println(name+"Goodbye "+"!");
}
}
IHello.class
package com.aopanalysis;
public interface IHello {
public void sayHello(String name);
public void sayGoodbye(String name);
}
接下来就是重头戏了!实现InvocationHandler接口,实现invoke()方法,然后在自己写一个bind()方法,具体如下
DynamicProxyHandler.class
package com.aopanalysis;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class DynamicProxyHandler implements InvocationHandler {
private Object delegate;
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
// TODO Auto-generated method stub
Object result = null;
Logger.logging("debug", method.getName() + " Method end .");
//JVM通过这条语句执行原来的方法(反射机制)
result = method.invoke(this.delegate, args);
//执行原来的方法之后记录日志
Logger.logging("log", method.getName() + " Method Start!");
return result;
}
public Object bind(Object delegate){
this.delegate = delegate;
return Proxy.newProxyInstance(this.delegate.getClass().getClassLoader(), this.delegate.getClass().getInterfaces(), this);
}
}
经过上面几步,动态代理的aop基本就实现了。接下来用一个测试类来测试下:
Test.class
package com.aopanalysis;
public class Test {
public static void main(String[] args) {
IHello test = (IHello) new DynamicProxyHandler().bind(new Hello("123"));
test.sayHello("Morning");
test.sayGoodbye("Night!");
}
}
结果如下图:
怎么样?是不是跟spring很像? 希望有机会各位大神不吝赐教,也希望明天自己能面试成功!
攒rp!